2017-12-09 4 views
0

いくつかのデバッグ用のPythonを作成しているうちに、私はクリーンアップしたいという醜いコードを作成したようです。ここでisinstance:セットクラスをより良く管理する方法

は、その全体が機能である:

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-除く声明を軽蔑、私はコードを繰り返していないという理由だけで、私はリクエストからCaseInsensitiveDictのような別の辞書クラス(に実行する場合、ヘッダー)は、出力をデバッグするときにうまく印刷したいので、try-except文をネストする必要があります。

type(variable)がでisinstanceで使用するためのタプルを作成するときに、それを追加し*dict**list*のようなものであるならば、私がチェックできる方法はありますか?

+1

'' OrderedDict''は有効な型ではなく、*文字列*です。 –

+1

あなたのコードが例外をスローする唯一の理由は、 'isinstance()'呼び出しで文字列を型として使用したためです。ここにタイプエラーをネストする理由はありません。 –

+1

このロジックの多くを処理するために 'logging'モジュールを使用しているようです。また、なぜインスタンスをチェックし、 'TypeError'が可能性を期待するのかは明らかではありません。 – chepner

答えて

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です。

+0

驚くばかり!御時間ありがとうございます。 –

関連する問題