![](/img/trans.png)
[英]How to optimize python code in pure pythonic way without cythonizing it
[英]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.