isinstance:如何更好地管理集合类

时间:2017-12-09 21:55:08

标签: python isinstance

在编写一些调试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),我想在调试输出期间很好地打印,我将不得不nest try-except语句。

有没有办法可以检查type(variable)*dict*还是*list*,然后在创建用于isinstance的元组时添加它?

1 个答案:

答案 0 :(得分:2)

你想看看@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的子类。