Python iInstance:如何更好地管理集合类

Python iInstance:如何更好地管理集合类,python,isinstance,Python,Isinstance,在编写一些python调试代码时,我似乎已经创建了一些难看的代码,我想对其进行清理 以下是整个功能: def debug(message, variable=None): if variable and DEBUG: print("\n" + str(type(variable))) try: if isinstance(variable, (list, dict, 'OrderedDict')):

在编写一些python调试代码时,我似乎已经创建了一些难看的代码,我想对其进行清理

以下是整个功能:

def debug(message, variable=None):
    if variable and DEBUG:
        print("\n" + str(type(variable)))
        try:
            if isinstance(variable, (list, dict, 'OrderedDict')):
                variable = json.dumps(
                    variable,
                    indent=4,
                    sort_keys=True
                )
        except TypeError:
            if isinstance(variable, (list, dict)):
                variable = json.dumps(
                    variable,
                    indent=4,
                    sort_keys=True
                )

    if DEBUG:
        if variable:
            print(message + str(variable) + "\n")
        else:
            print("\n" + message)
我特别鄙视我的try-except语句,因为我不仅在重复代码,而且如果我遇到另一个字典类(比如来自请求头的CaseInsensitiveDict),我想在调试输出期间很好地打印它,我就必须嵌套try-except语句

是否有一种方法可以检查
类型(变量)
是否与
*dict*
*list*
类似,然后在创建用于iInstance的元组时添加它?

您想查看;这使您可以委托特定函数来处理调试,键入类型:

from functools import singledispatch

def debug(message, variable=None):
    if not DEBUG:
        return
    variable = debug_display(variable)
    print('{}{}\n'.format(message, variable))

@singledispatch
def debug_display(variable):
    return str(variable)

@debug_display.register(type(None))
def _none_to_empty_string(_ignored):
    return ''

@debug_display.register(dict)
@debug_display.register(list)
@debug_display.register(OrderedDict)
def _as_json(variable):
    return json.dumps(
        variable,
        indent=4,
        sort_keys=True
    )

@debug_display.register(SomeOtherType)
def _handle_specific_type(variable):
    # handle custom types any way you need to with separate registrations
    return "{} -> {}".format(variable.spam, variable.ham)
singledispatch
知道如何委托没有特定处理程序的子类;因此,
OrderedDict
\u作为_json
处理程序处理,因为它是
dict
的子类,您要查看;这使您可以委托特定函数来处理调试,键入类型:

from functools import singledispatch

def debug(message, variable=None):
    if not DEBUG:
        return
    variable = debug_display(variable)
    print('{}{}\n'.format(message, variable))

@singledispatch
def debug_display(variable):
    return str(variable)

@debug_display.register(type(None))
def _none_to_empty_string(_ignored):
    return ''

@debug_display.register(dict)
@debug_display.register(list)
@debug_display.register(OrderedDict)
def _as_json(variable):
    return json.dumps(
        variable,
        indent=4,
        sort_keys=True
    )

@debug_display.register(SomeOtherType)
def _handle_specific_type(variable):
    # handle custom types any way you need to with separate registrations
    return "{} -> {}".format(variable.spam, variable.ham)

singledispatch
知道如何委托没有特定处理程序的子类;因此,
orderedict
\u as_json
处理程序处理,因为它是
dict
的子类,
'orderedict'
不是一个有效的类型,那是一个字符串。代码引发异常的唯一原因是因为在
isinstance()调用中使用了字符串作为类型。没有理由在这里嵌套任何类型错误。似乎您可以使用
日志记录
模块来处理大部分此类逻辑。也不清楚为什么您会检查一个实例,但仍然期望出现
TypeError
。感谢您的帮助。当使用
xmltodict
时,它是一个set类,当解析使用
xmltodict.parse(xml\u字符串)
设置的变量时,此代码的行为与预期的一样。据我所知,元组必须是类型或类。我必须检查我以前没有使用过的
日志记录
模块。
'orderedict'
不是有效的类型,这是一个字符串。代码引发异常的唯一原因是因为在
isinstance()调用中使用了字符串作为类型。没有理由在这里嵌套任何类型错误。似乎您可以使用
日志记录
模块来处理大部分此类逻辑。也不清楚为什么您会检查一个实例,但仍然期望出现
TypeError
。感谢您的帮助。当使用
xmltodict
时,它是一个set类,当解析使用
xmltodict.parse(xml\u字符串)
设置的变量时,此代码的行为与预期的一样。据我所知,元组必须是类型或类。我必须检查
日志记录
模块,我以前从未使用过它。太棒了!谢谢你的时间,太棒了!谢谢你抽出时间。