对于这个功能
def eat_dog(name, should_digest=True):
print "ate dog named %s. Digested, too? %" % (name, str(should_digest))
Run Code Online (Sandbox Code Playgroud)
我希望,在函数外部,读取它的参数和附加的任何默认值.所以对于这个具体的例子,我想知道它name没有默认值(即它是必需的参数),这True是默认值should_digest.
我知道inspect.getargspec(),它确实给了我关于参数和默认值的信息,但我发现两者之间没有联系:
ArgSpec(args=['name', 'should_digest'], varargs=None, keywords=None, defaults=(True,))
从这个输出我怎么能告诉True(在defaults元组中)是默认值should_digest?
另外,我知道接近问题的"请求宽恕"模型,但不幸的是,该错误的输出不会告诉我缺少参数的名称:
>>> eat_dog()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: eat_dog() takes at least 1 argument (0 given)
Run Code Online (Sandbox Code Playgroud)
为了给出上下文(为什么我要这样做),我通过JSON API在模块中公开函数.如果调用者省略了某些函数参数,我想返回一个特定的错误,该错误命名了省略的特定函数参数.如果客户端省略了参数,但函数签名中提供了默认值,我想使用该默认值.
是否有可能有条件地将任意数量的命名默认参数传递给Python函数?
例如.有一个功能:
def func(arg, arg2='', arg3='def')
Run Code Online (Sandbox Code Playgroud)
现在的逻辑是我有一个条件来确定是否需要传递arg3,我可以这样做:
if condition == True:
func('arg', arg2='arg2', arg3='some value')
else:
func('arg', arg2='arg2')
Run Code Online (Sandbox Code Playgroud)
问题是,我可以用速记如下:
func('arg', 'arg2', 'some value' if condition == True else # nothing so default gets picked
)
Run Code Online (Sandbox Code Playgroud) 我今天遇到了一个有趣的python bug,其中实例化一个类似乎反复出现状态.在以后的实例化调用中,已经定义了变量.
我将问题归结为以下类/ shell交互.我意识到这不是初始化类变量的最佳方法,但它肯定不应该像这样.这是一个真正的错误还是这个"功能"?:d
tester.py:
class Tester():
def __init__(self):
self.mydict = self.test()
def test(self,out={}):
key = "key"
for i in ['a','b','c','d']:
if key in out:
out[key] += ','+i
else:
out[key] = i
return out
Python提示:
Python 2.6.6 (r266:84292, Oct 6 2010, 00:44:09)
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
>>> import tester
>>> t = tester.Tester()
>>> print t.mydict
{'key': 'a,b,c,d'}
>>> t2 = tester.Tester()
>>> print t2.mydict
{'key': 'a,b,c,d,a,b,c,d'}
我有以下代码。在此,我想利用为'a'提供的可选参数;即“ 5”,而不是“ 1”。如何使元组“数字”包含的第一个元素为1而不是2?
def fun_varargs(a=5, *numbers, **dict):
print("Value of a is",a)
for i in numbers:
print("Value of i is",i)
for i, j in dict.items():
print("The value of i and j are:",i,j)
fun_varargs(1,2,3,4,5,6,7,8,9,10,Jack=111,John=222,Tom=333)
Run Code Online (Sandbox Code Playgroud)