在编写一些调试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的元组时添加它?
答案 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
的子类。