isinstance:如何更好地管理 set 类

isinstance: How to manage set classes better

在编写一些调试程序时 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 声明,因为我不仅在重复代码,而且如果我 运行 进入另一个字典 class (比如请求中的 CaseInsensitiveDict headers) 我想在调试输出期间很好地打印我将不得不嵌套 try-except 语句。

有没有一种方法可以检查 type(variable) 是否像 *dict**list* 然后在创建用于 isinstance 的元组时添加它?

你要看@functools.singledispatch() construct;这使您可以委托特定函数来处理调试,键入类型:

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_as_json 处理程序处理,因为它是 dict.

的子类