将输入解释为字符串和类成员名称

时间:2016-11-22 00:02:56

标签: python

在一些__init__个不同的类中,我必须多次使用构造

try:
    self.member_name = kwargs['member_name']
except:
    self.member_name = default_value

或按照Moses Koledoye的建议

self.member_name = kwargs.get('member_name', default_value)

我想要一个输入字符串'member_name'default_value的方法,并生成相应的初始化。例如,如果输入'pi_approx'3.14,则生成的代码为

self.pi_approx = kwargs.get('pi_approx', 3.14)

通过这种方式,我可以通过循环沿着所有必需成员及其默认值的列表替换这些初始化的长序列。

This technique emulate a switch statement不是一回事,但有一种相似的味道。

我不知道如何处理我想做的事情。

假设initializer(m_name, default_val)是由

替换的构造
self.m_name = kwargs.get('m_name', default_val)

然后我会使用列表member_names = [m_name1, m_name2, m_name3]default_values = [def_val1, def_val2, def_val3]并调用

来使用它
for m_name, d_val in zip(member_names, default_values):
    initializer(m_name, d_val)

这将取代长长的try列表,并使代码更具可读性。

1 个答案:

答案 0 :(得分:2)

如果您的try/except意图处理KeyError,那么您可以使用kwargs dict的get方法,它允许您提供默认值:

self.member_name = kwargs.get('member_name', default)

可以使用setattr扩展到您的属性名称列表:

for m_name, d_val in zip(member_names, default_values):
    setattr(self, m_name, kwargs.get(m_name, d_val))