使用 exec 进行变量赋值是 pythonic 的吗?
Is the use of exec for variable assignment pythonic?
考虑这段代码:
self._t10_test = None
self._t20_test = None
self._t30_test = None
id_lst = ['10', '20', '30']
msg_lst = ['Message for A', 'Message for B', 'Message for C')
在这种情况下使用 exec
是否正确?
for id, msg in zip(id_lst, msg_lst):
exec((f'self._t{id}_test = {msg}')
或者这会更像 pythonic 吗?
for id, msg in zip(id_lst, msg_lst):
set_msg(id, msg)
def set_msg(id, msg):
if id == '10':
self._t10_test = msg
elif id == '20':
self._t20_test = msg
elif id == '30':
self._t30_test = msg
使用exec()
is invariably a bad idea. I find generally that if you ever think you need variables within variable names, a better choice is to use a dictionary。例如:
self._t_test = {'10': None,
'20': None,
'30': None}
id_lst = ['10', '20', '30']
msg_lst = ['Message for A', 'Message for B', 'Message for C']
for i, msg in zip(id_lst, msg_lst):
self._t_test[i] = msg
这给了我们:
>>> self._t_test
{'10': 'Message for A', '20': 'Message for B', '30': 'Message for C'}
>>> self._t_test['10']
'Message for A'
你甚至可以使用字典理解:
>>> self._t_test = {k: v for k, v in zip(id_lst, msg_lst)}
>>> self._t_test
{'10': 'Message for A', '20': 'Message for B', '30': 'Message for C'}
考虑这段代码:
self._t10_test = None
self._t20_test = None
self._t30_test = None
id_lst = ['10', '20', '30']
msg_lst = ['Message for A', 'Message for B', 'Message for C')
在这种情况下使用 exec
是否正确?
for id, msg in zip(id_lst, msg_lst):
exec((f'self._t{id}_test = {msg}')
或者这会更像 pythonic 吗?
for id, msg in zip(id_lst, msg_lst):
set_msg(id, msg)
def set_msg(id, msg):
if id == '10':
self._t10_test = msg
elif id == '20':
self._t20_test = msg
elif id == '30':
self._t30_test = msg
使用exec()
is invariably a bad idea. I find generally that if you ever think you need variables within variable names, a better choice is to use a dictionary。例如:
self._t_test = {'10': None,
'20': None,
'30': None}
id_lst = ['10', '20', '30']
msg_lst = ['Message for A', 'Message for B', 'Message for C']
for i, msg in zip(id_lst, msg_lst):
self._t_test[i] = msg
这给了我们:
>>> self._t_test
{'10': 'Message for A', '20': 'Message for B', '30': 'Message for C'}
>>> self._t_test['10']
'Message for A'
你甚至可以使用字典理解:
>>> self._t_test = {k: v for k, v in zip(id_lst, msg_lst)}
>>> self._t_test
{'10': 'Message for A', '20': 'Message for B', '30': 'Message for C'}