0

さまざまな種類のデータを処理するハンドラーを作成しています。これが私の現在の解決策です:

def get_handler_by_type(type):
    def handler_for_type_A:
        ...
        #code for processing data type A

    def handler_for_type_B:
        ...
        #code for processing data type B

    def handler_for_type_C:
        ...
        #code for processing data type C

    handler_map = {type_A: handler_for_type_A,
               type_B: handler_for_type_B,
               type_C: handler_for_type_C,
              }
    return handler_map(type)

ただし、get_handler_by_type を頻繁に呼び出し、呼び出されるたびにディクショナリが再構築されるため、これは非常に非効率的です。

私は代わりにこれを行うことができることを知っています:

def handler_for_type_A:
    ...
    #code for processing data type A

def handler_for_type_B:
    ...
    #code for processing data type B

def handler_for_type_C:
    ...
    #code for processing data type C

handler_map = {type_A: handler_for_type_A,
                type_B: handler_for_type_B,
                type_C: handler_for_type_C,
            }

def get_handler_by_type(type, handler_map = handler_map):
    return handler_map(type)

しかし、これは私の意見ではかなり醜いです。グローバル空間を汚染している handler_for_type_Xs と handler_map があるためです。これを効率的かつエレガントに行う方法はありますか?

ご意見ありがとうございます。

4

2 に答える 2

2

1 つの方法は、ハンドラーを動的に検索することです (一貫した命名規則がある場合)。

return vars()['handler_for_'+type]

別の方法は、マップを関数の属性として保存することです

def get_handler_by_type(type):
    def handler_for_type_A:
        ...
        #code for processing data type A

    def handler_for_type_B:
        ...
        #code for processing data type B

    def handler_for_type_C:
        ...
        #code for processing data type C

    if not hasattr(get_handler_by_type, 'handler_map'):
        get_handler_by_type.handler_map = {'type_A': handler_for_type_A,
               'type_B': handler_for_type_B,
               'type_C': handler_for_type_C,
              }

    return get_handler_by_type.handler_map[type]
于 2013-03-15T03:39:54.807 に答える
1

この方法でカプセル化します。

def _handler_helper():
   def fna():
      print "a" 
      pass

   def fnb():
      print "b" 
      pass

   m = {"a":fna,"b":fnb}
   return lambda x:m[x]

get_handler_by_type = _handler_helper()

defdocstring が必要な場合に使用することもできますが、これは機能します。

別のオプションは、より OOP アプローチを使用することです。

class _HandlerHelper:
   def fna(self):
       print 'a'

   def fnb(self):
       print 'b'

   # __call__ is a magic method which lets you treat the object as a function
   def __call__(self, fn):
       return getattr(self, 'fn' + fn)

get_handler_by_type = _HandlerHelper()
于 2013-03-15T03:36:57.263 に答える