在Python中,有没有一种简单的方法来检查可选参数的值是否来自其默认值,或者是因为用户已在函数调用中显式设置了它?
很多答案都没有完整信息的一部分,因此我想将所有信息与我最喜欢的模式结合在一起。
mutable
类型如果默认值是可变对象,那么您很幸运:您可以利用以下事实:在定义函数时,Python的默认参数将被评估一次(上一节答案末尾的更多信息)
这意味着您可以轻松地使用is
来比较默认的可变值,以查看它是作为参数传递还是默认保留,如以下示例中作为函数或方法所示:
def f(value={}):
if value is f.__defaults__[0]:
print('default')
else:
print('passed in the call')
和
class A:
def f(self, value={}):
if value is self.f.__defaults__[0]:
print('default')
else:
print('passed in the call')
现在,如果您的默认值应该是一个immutable
值(记住,即使字符串是不可变的!),也会有点不太优雅,因为您无法按原样利用该技巧,但是仍然可以做一些事情,仍然可以利用可变的类型;
基本上,您可以在函数签名中放置一个 可变的 “假”默认值,并在函数主体中放置所需的“真实”默认值。
def f(value={}):
"""
my function
:param value: value for my function; default is 1
"""
if value is f.__defaults__[0]:
print('default')
value = 1
else:
print('passed in the call')
# whatever I want to do with the value
print(value)
如果您的实际默认值为None
,则感觉特别可笑,但它None
是不可变的,因此…您仍然需要显式使用mutable作为函数的默认参数,并在代码中切换为None。
Default
类用于不可变默认值或者类似于@cz建议,如果python docs还不够:-),则可以在两者之间添加一个对象以使API更加明确(无需阅读docs);或者
used_proxy_默认类实例是可变的,并将包含您要使用的实际默认值。
class Default:
def __repr__(self):
return "Default Value: {} ({})".format(self.value, type(self.value))
def __init__(self, value):
self.value = value
def f(default=Default(1)):
if default is f.__defaults__[0]:
print('default')
print(default)
default = default.value
else:
print('passed in the call')
print("argument is: {}".format(default))
现在:
>>> f()
default
Default Value: 1 (<class 'int'>)
argument is: 1
>>> f(2)
passed in the call
argument is: 2
上面的也很好用Default(None)
。
显然,上述模式看起来比它们应有的丑陋,因为所有print
这些仅用于显示它们如何工作。否则,我会发现它们简洁而可重复。
您可以编写一个装饰器__call__
,以更简化的方式添加@dmg建议的模式,但这仍然必须在函数定义本身中使用怪异的技巧-
您将需要拆分,value
并且value_default
如果您的代码需要区分它们,那么我没有看到太多优势,因此我不会写示例:-)
有关#1 python陷阱的更多信息!,出于您自己的喜好而受到滥用。您可以通过执行以下操作来查看 定义时 的 评估结果 :
def testme(default=[]):
print(id(default))
您可以根据需要运行任意testme()
多次,您将始终看到对同一默认实例的引用(因此,您的默认实例基本上是不可变的:-))。
请记住,在Python中只有3个可变内置类型:set
,list
,dict
,其他一切-
甚至弦乐!-是一成不变的。
Python中是否有一种简单的方法可以检查可选参数的值是否来自其默认值,或者是因为用户在函数调用时显式设置了它?
给定一个非常简单的类: 要检查是否尚未赋值,只需执行是?
问题内容: 如何检查是否设置了项目?目前我正在使用 问题答案: 如果该项不存在,则WebStorage规范中的方法显式返回: …如果给定键在与对象关联的列表中不存在,则此方法必须返回null。… 所以你可以:
问题内容: 我试图找到如何检查是否设置了结构属性,但找不到任何方法。 我期待这样的事情,但实际上这是行不通的: 问题答案: 就像dyoo所说的,如果您的struct属性是指针,则可以使用。如果您想将它们保留为字符串,可以与进行比较。这是一个示例: http://play.golang.org/p/YStKFuekeZ
如何检查字节中的某个位是否被设置?
问题内容: 好吧,我是SQL的新手,我刚刚读到,存储过程始终返回一个值,确定该过程中的查询是否已成功执行是一种很好的做法。 所以我有一个带有select语句的简单存储过程,如果要执行,我想返回1,否则返回-1。 您能告诉我如何用SQL编写该条件吗? 如果有关系,我的数据库是MS SQL Server。 谢谢你。 问题答案: 使用输出参数返回成功状态以及Try..Catch块