簡體   English   中英

如何優化回調python代碼以獲得更好的可讀性和pythonic實踐?

[英]How to optimize the callback python code for better readability and pythonic practice?

我有一個需要從構造函數調用的私有函數。 這個私有函數的工作是訂閱外部程序通知的事件。 所有訂閱函數都需要通用參數,如 freq、initialPublication、initialSuspended、回調和異步。 我希望所有訂閱參數都相同。 但是,回調應該有所不同。 這是我創建的通用參數字典。

params = {'freq': 0, 'initialPublication': True,

                      'initiallySuspended': False, 'callback': None,

                      'asynchronous':   True,

                      }

                  

我添加了一個評論,我覺得很重復,即

params[callback] = self.callback_test_sub1
 subscribe_attrib = 'subscribe_testSub1'
 if not self._subscribe(params, subscribe_attrib):
            return False
 ......
 

我可以做些什么來改善這一點,或者它是否已經處於最佳狀態?

class Test:
    
    def callback_test_sub1(self, sub1_data):
        print('got sub1 data')
        
    def callback_test_sub2(self, sub2_data):
        print('got sub2 data')
        
    def notify_test_sub3(self, sub3_data):
        print('got sub3 data')
        
    def _subscribe(self, params, subscribe_attribute):
        try:
            func = getattr(self.external_obj, subscribe_attribute)
            err_status = func(**params)
        except AttributeError:
            print('no such attribute')

        except Exception as e:
            print(e)
    
    def __init__(self):
        params = {'freq': 0, 'initialPublication': True,
        'initiallySuspended': False, 'callback': None, 'asynchronous': True}
        
        ###  while doing these 3 callbacks, I feel repetitive
        params[callback] = self.callback_test_sub1
        subscribe_attrib = 'subscribe_testSub1'
        if not self._subscribe(params, subscribe_attrib):
            return False
        params[callback] = self.callback_test_sub2
        subscribe_attrib = 'subscribe_testSub2'
        if not self._subscribe(params, subscribe_attrib):
            return False
        params[callback] = self.callback_test_sub2
        subscribe_attrib = 'subscribe_testSub3'
        if not self._subscribe(params, notify_test_sub3):
            return False
        ###  while doing these 3 callbacks, I feel repetitive end
        return True

如果你不想重復這些小塊,你可以制作一個列表來迭代:

callbacks = (('subscribe_testSub1', self.callback_test_sub1), 
             ('subscribe_testSub2', self.callback_test_sub2), 
             ('subscribe_testSub3', self.callback_test_sub3))
for attribute, callback in callbacks:
    params['callback'] = callback
    if not self._subscribe(params, attribute)
        return False

鑒於您的代碼示例已經顯示了幾個拼寫錯誤/錯誤,減少這種重復實際上可能很有用。 如果回調和屬性名稱具有特定模式,您還可以計算它們並使用getattr檢索,但代碼可能會變得更加晦澀,無法靜態驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM