我想在Python 3.7中模仿Python 3.8的这种行为
仅位置参数/
是引入的语法,用于指示某些函数参数必须按位置指定,并且不能用作关键字参数。
#Python3.8
def f(a,b,/,**kwargs):
print(a,b,kwargs)
>>> f(1,2,**{'a':100,'b':200,'c':300})
# 1 2 {'a': 100, 'b': 200, 'c': 300}
字符串a
、b
仅用作位置参数。
我如何在Python 3.7中做同样的事情
#Python3.7
def f(a,b,**kwargs):
print(a,b,kwargs)
>>> f(1,2,**{'a':1,'b':2})
# TypeError: f() got multiple values for argument 'a'
型
如何使a
,b
仅为位置参数。/
在Python 3.8中不起作用
在Python3.7中可以模仿/
语法吗?
1条答案
按热度按时间olqngx591#
您可以创建一个自定义的装饰器来声明仅限位置的参数,返回一个 Package 器来解析它自己的
*args, **kwargs
,使它们适合装饰函数的签名。不能使用关键字-参数-打包(**
)(这是唯一的限制)。封装的保留字参数必须宣告为最后一个positional-or-keyword参数,或是宣告为第一个keyword-only参数。以下是两个范例:字符串
变量
kwargs
将从 Package 函数中接收剩余的**kwargs
,也就是说,它可以像**kwargs
直接用在修饰函数中一样使用(就像在Python 3.8+中一样)。以下装饰器的实现主要基于
inspect.Signature.bind
的实现,并进行了一些小的调整,以便通过装饰器声明的名称处理仅限位置的参数,并处理附加的(人工)kwargs
参数。型
下面是如何使用它的示例:
型