5

我有这个代码:

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]

这是一个坏主意吗?有没有更好的方法来做到这一点?

4

4 回答 4

9

来自Python 之禅简单胜于复杂。可读性很重要。

显式赋值比使用魔法设置值更具可读性和简单性。

于 2012-06-11T01:51:36.130 回答
2

以@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 或多或少,但它似乎会在以后试图弄清楚为什么有人使用您的代码可能会遇到奇怪的错误时节省大量时间。

于 2012-06-11T23:28:55.397 回答
1

始终考虑可读性而不是巧妙的设计。替换代码更容易阅读吗?我可能会离开它。请记住,简单胜于复杂。正如 ThiefMaster 所说,显式分配更具可读性。

于 2012-06-11T04:17:09.217 回答
0

Python3 用户的另一种选择:来自drasticinit的装饰器。

@init
def __init__(self, a, b, c, d, e, f, g, h):
    # nothing to write here!
于 2017-03-18T19:07:49.250 回答