这是使用exec pythonic吗?

问题描述 投票:1回答:1

考虑此代码:

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

谢谢大家的想法!

python python-3.x list design-patterns exec
1个回答
0
投票

exec()的使用总是一个坏主意。我发现一般来说,如果您认为需要在变量名中使用变量,那么更好的选择是使用字典。例如:

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'}
© www.soinside.com 2019 - 2024. All rights reserved.