【发布时间】:2011-09-05 08:12:10
【问题描述】:
我在一个函数中使用argspec,它接受另一个函数或方法作为参数,并返回一个像这样的元组:
(("arg1", obj1), ("arg2", obj2), ...)
这意味着传递函数的第一个参数是 arg1,它的默认值是 obj1,依此类推。
问题来了:如果它没有默认值,我需要一个占位符值来表示这一点。我不能使用 None,因为那样我就无法区分 no default value 和 default value is None。同样适用于 False、0、-1 等。我可以将其设置为具有单个元素的元组,但是用于检查它的代码会很丑陋,而且我不能轻易地将它变成一个 dict。所以我想我会创建一个不是 None 的类似 None 的对象,这就是我想出的:
class MetaNoDefault(type):
def __repr__(cls):
return cls.__name__
__str__ = __repr__
class NoDefault(object):
__metaclass__ = MetaNoDefault
现在("arg1", NoDefault) 表示arg1 没有默认值,我可以执行if obj1 is NoDefault: 等操作。元类使其打印为NoDefault 而不是<class '__main__.NoDefault'>。
有什么理由不这样做吗?有没有更好的解决方案?
【问题讨论】:
-
有什么理由为什么不能只有一个元素的元组没有默认值?类似:
(("arg1",), ("arg2", obj2), ...)其中“arg1”没有默认值。如果len(the_tuple) == 1等,您可以这样做。 -
@FMc:为了避免意外修改默认参数而导致错误,最好不要使用可变默认值。
-
@Fenikso 我已经在我的问题中提到了这种可能性。简而言之,我觉得它不优雅,尽管它是直观的。