如果没有传入显式值,我想要用一些默认值初始化方法的参数 - 就像这样:
class Example
def __init__(self, data = self.default_data()):
self.data = data
def default_data():
# ....
return something
我遇到了这个错误:
NameError: name 'self' is not defined
我该如何修复这个问题?
如果没有传入显式值,我想要用一些默认值初始化方法的参数 - 就像这样:
class Example
def __init__(self, data = self.default_data()):
self.data = data
def default_data():
# ....
return something
我遇到了这个错误:
NameError: name 'self' is not defined
我该如何修复这个问题?
None
,尽管有人建议使用Ellipsis
),然后您可以进行检查。class Example(object): #inherit from object. It's just a good idea.
def __init__(self, data = None):
self.data = self.default_data() if data is None else data
def default_data(self): #probably need `self` here, unless this is a @staticmethod ...
# ....
return something
object()
来作为标志的实例。SENTINEL = object()
class Example(object):
def __init__(self, data = SENTINEL):
self.data = self.default_data() if data is SENTINEL else data
None
传递给你的函数,但也有一些缺点(请参见下面 @larsmans 的评论)。如果你不预见到需要将 None
作为一个有意义的参数传递给你的方法,那么我建议使用这种方式。object()
作为哨兵的缺点是它在文档字符串中显示非常丑陋,并且默认行为更难以通过显式手段获得,因此传递 None
是通常的做法(在标准库和我所知道的大多数其他 Python 库中都是如此)。 - Fred FooNone
,但如果你想传递 None
,那么 object()
就是下一个最好的选择。如果你愿意,你可以继承 object 并重写 __repr__
使 help
看起来更美观... 另外,如果你导入 Example
,你也可以导入 SENTINEL
。 - mgilsonobject
可以使代码更具可移植性,而且这很容易做到。从这个角度来看,继承自object
似乎是有意义的选择。 - mgilsonEllipsis
单例,所以你实际上可以使用foo(bar=...)
。 - Eryk Sun