对于我当前的项目,我已经定义了许多类,每个类都使用许多输入进行初始化。与this post非常相似,我想将每个输入设置为类属性,但我想避免单独设置每个属性。我意识到有几种方法可以做到这一点;我的首选方式如下:
class foo(object):
def __init__(self,a=1,b=2,c=2):
inpt = locals()
for k,v in inpt.items():
if not k in ('self',):
setattr(self,k,v)
我的问题是:以这种方式使用locals()会有什么陷阱?这看起来效果很好,但是我从与我一起工作的程序员以及其他线程上的一些评论中找到了一些不安(做这个“如果你必须”)。然而,没有人能够明确地告诉我什么可能出错,或者说是什么让他们感到不安。那么......它有什么问题?
答案 0 :(得分:2)
Python#2的禅:"明确比隐含更好。"
Python#3的禅:"简单比复杂更好。"
Python#7的禅:"可读性计数。"
在您的代码示例中,使用显式方式,和,您可以使用完全相同的代码行获得相同的结果,这将更容易理解和维护。
所以:你的代码片段在技术上没有任何问题,但你正在交易三个重要的Python值(明确的,简单的和可读的)......好吧,具体到底是什么?最复杂案例的几行代码?
现在有这样的解决方案可能有意义的背景(ORM"模型"基类出现在脑海中),但是你可能会使用**kwargs
而不是命名args和locals()
。