【问题标题】:Is the use of exec for variable assignment pythonic?使用 exec 进行变量赋值 pythonic 吗?
【发布时间】:2020-02-07 12:13:46
【问题描述】:

考虑这段代码:

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 绝不是pythonic

标签: python python-3.x list design-patterns exec


【解决方案1】:

使用exec() 总是一个坏主意。我通常发现,如果您认为在变量名中需要变量,更好的选择是使用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._t_test = dict(zip(id_lst, msg_lst))
猜你喜欢
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 2020-02-16
  • 2021-10-07
  • 2014-06-17
  • 1970-01-01
相关资源
最近更新 更多