我有这个代码:
def __init__(self, a, b, c, d...):
self.a = a
self.b = b
etc
我正在考虑将其替换为:
def __init__(self, a, b, c, d...):
args=locals()
for key in args:
self.__dict__[key] = args[key]
这是一个坏主意吗?有没有更好的方法来做到这一点?
来自Python 之禅:简单胜于复杂。和可读性很重要。
显式赋值比使用魔法设置值更具可读性和简单性。
以@ThiefMaster 的评论为基础**kwargs
:
如果您接收 20 个参数,则要求您的用户通过关键字而不是位置发送参数可能更有意义:使用 20 个参数,使用您的代码的人很有可能会以错误的顺序获取参数。
考虑只接受 kwargs,同时拥有您想要接受的预定义键列表,如果您没有收到它们,则引发 ValueError。所以你可以使用**kwargs
然后检查一切是否都在那里。例如
INITIAL_ARGS = set(['a','b','c','d','e'...])
def __init__(self, **kwargs):
if not INITIAL_ARGS.issubset(set(kwargs.iterkeys())):
raise ValueError("Class <myclass> requires 20 keyword arguments"
"only given %d" % len(kwargs))
self.__dict__.update(kwargs)
不确定这是否比您原来的 Pythonic 或多或少,但它似乎会在以后试图弄清楚为什么有人使用您的代码可能会遇到奇怪的错误时节省大量时间。
始终考虑可读性而不是巧妙的设计。替换代码更容易阅读吗?我可能会离开它。请记住,简单胜于复杂。正如 ThiefMaster 所说,显式分配更具可读性。
Python3 用户的另一种选择:来自drasticinit
的装饰器。
@init
def __init__(self, a, b, c, d, e, f, g, h):
# nothing to write here!