Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python`functools.wrapps`don';我不能正确处理违约_Python_Python 3.x_Decorator - Fatal编程技术网

Python`functools.wrapps`don';我不能正确处理违约

Python`functools.wrapps`don';我不能正确处理违约,python,python-3.x,decorator,Python,Python 3.x,Decorator,使用functools.wrapps时,签名声明一组默认值,但(wrapped)函数使用原始(wrappee)默认值 为什么这是件好事? 从functools导入包装 请检查进口签名 def g(a:浮动,b=10): 返回a*b def f(a:int,b=1): 返回a*b 断言f(3)=3 f=包装(g)(f) 断言str(签名(f))='(a:float,b=10)#签名表示b默认为10 断言f.uu默认值uu==(1,)#。。。但这是谎言! 断言f(3)==3!=g(3)==30#。。

使用
functools.wrapps
时,签名声明一组默认值,但(wrapped)函数使用原始(wrappee)默认值

为什么这是件好事?

从functools导入包装
请检查进口签名
def g(a:浮动,b=10):
返回a*b
def f(a:int,b=1):
返回a*b
断言f(3)=3
f=包装(g)(f)
断言str(签名(f))='(a:float,b=10)#签名表示b默认为10
断言f.uu默认值uu==(1,)#。。。但这是谎言!
断言f(3)==3!=g(3)==30#。。。一个可能导致问题的人!
为什么会这样?因为
functools.wrapps
更新了
\uuuuuu签名\uuuuuu
(包括注释和默认值),
\uuuuuuuu注释\uuuuuuuu
,而不是
\uuuuu默认值\uuuuuuuuuuuuuuuuuuuu
,python显然是通过它来指定默认值的

一种解决方案是礼貌地要求包装包含这些默认值

从functools导入包装、包装器分配、部分
my_wrapps=部分(wrapps,assigned=(列表(WRAPPER_ASSIGNMENTS)+[“默认值”、“\uuuuuuuuu默认值”])
def g(a:浮动,b=10):
返回a*b
def f(a:int,b=1):
返回a*b
断言f(3)=3
f=我的包(g)(f)
断言f(3)==30==g(3)
断言f.uu默认值uu==(10,)#。。。因为现在有了g默认值!

但是为什么我不能免费得到呢?我什么时候会希望实际使用的默认值与签名中提到的不同

见“损坏的签名”一节。就像Python中经常出现的情况一样,这里有比stdlib更好的第三方选项。我第一次看到任何人在网上如此不情愿地得出结论,以至于他们在Python中发现了一个bug@有点,但这对我来说确实像个虫子。我可能遗漏了一些东西,但我认为OP可以合理地向bugs.python.org报告。也许这有一个很好的理由,也许现在改变已经太晚了,但他们可以给出最好的答案。@AlexHall:我可以同意你的观点,但不确定群众认为“bug”的门槛在哪里。这里我只能说,当我使用
wrapps
开箱即用时,它与实际默认值和签名所说的默认值不一致。我的问题是:这有什么好的理由吗?还是仅仅是忽视了这点。@thorwhalen你在那里没有被压垮或欺负,你被问得很清楚。这个问题和一些评论写得很混乱,将标准包装与您自己的版本混为一谈。