Python,可变长度位置参数后的默认关键字参数

时间:2023-01-20 11:12:06

I thought I could use named parameters after variable-length positional parameters in a function call in Python 2, but I get a SyntaxError when importing a python class. I'm writing with the following "get" method, for example:

我想我可以在Python 2的函数调用中使用可变长度位置参数之后的命名参数,但是在导入python类时我得到一个SyntaxError。我正在使用以下“get”方法编写,例如:

class Foo(object):
    def __init__(self):
        print "You have created a Foo."

    def get(self, *args, raw=False, vars=None):
        print len(args)
        print raw
        print vars

The error looks like:

错误如下:

def get(self, *args, raw=False, vars=None):
                     ^
SyntaxError: invalid syntax

I'd like to be able to call the method several ways:

我希望能够通过以下几种方式调用该方法:

f = Foo()
f.get(arg1, arg2)
f.get(arg1, raw=True)
f.get(arg1, arg2, raw=True, vars=something)

etc.

等等

2 个解决方案

#1


62  

It does work, but only in Python 3. See PEP 3102. From glancing over the "what's new" documents, it seems that there is no 2.x backport, so you're out of luck. You'll have to accept any keyword arguments (**kwargs) and manually parse it. You can use d.get(k, default) to either get d[k] or default if that's not there. To remove an argument from kwargs, e.g. before calling a super class' method, use d.pop.

它确实有效,但仅限于Python 3.参见PEP 3102.从浏览“什么是新的”文档来看,似乎没有2.x的后端,所以你运气不好。您必须接受任何关键字参数(** kwargs)并手动解析它。您可以使用d.get(k,默认值)获取d [k]或默认值(如果不存在)。要从kwargs中删除参数,例如在调用超类方法之前,请使用d.pop。


Note that in def get(self, *args, raw=False, vars=None):, the raw=False and vars=None have nothing to do with keyword arguments. Those are default argument values. Arguments with a default value may be passed positionally, and arguments without a default value may be passed by keyword:

请注意,在def get(self,* args,raw = False,vars = None):中,raw = False和vars = None与关键字参数无关。这些是默认参数值。具有默认值的参数可以按位置传递,而没有默认值的参数可以通过关键字传递:

def f(a=1): pass
f(2)  # works, passing a positionally
def f(a): pass
f(a=2)  # works, passing a by keyword

Similarly, keyword-only arguments are not required to have a default value. Coming after the *args argument is what marks them as keyword-only, not the presence of a default value:

同样,仅关键字参数不需要具有默认值。在* args参数之后,将它们标记为仅关键字,而不是存在默认值:

def f(*args, a): pass
# a is a mandatory, keyword-only argument

#2


42  

Python's syntax doesn't allow variable args in function and keyword arguments with default value at the same time. If you must have keyword arguments along with arbitrary number of positional arguments, you need to allow arbitrary number of keyword arguments as well.

Python的语法不允许函数和关键字参数中的变量args同时具有默认值。如果必须具有关键字参数以及任意数量的位置参数,则还需要允许任意数量的关键字参数。

This is a common pattern to provide default values for keyword arguments, as well as allowing any number of positional arguments:

这是为关键字参数提供默认值以及允许任意数量的位置参数的常见模式:

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)

If you don't use the extra keyword arguments at all, you have nothing to worry about. This makes the function a bit less self-documenting, which you can make up with a properly written docstring.

如果您根本不使用额外的关键字参数,则无需担心。这使得函数的自我记录变得更少,您可以使用正确编写的文档字符串来弥补。

#1


62  

It does work, but only in Python 3. See PEP 3102. From glancing over the "what's new" documents, it seems that there is no 2.x backport, so you're out of luck. You'll have to accept any keyword arguments (**kwargs) and manually parse it. You can use d.get(k, default) to either get d[k] or default if that's not there. To remove an argument from kwargs, e.g. before calling a super class' method, use d.pop.

它确实有效,但仅限于Python 3.参见PEP 3102.从浏览“什么是新的”文档来看,似乎没有2.x的后端,所以你运气不好。您必须接受任何关键字参数(** kwargs)并手动解析它。您可以使用d.get(k,默认值)获取d [k]或默认值(如果不存在)。要从kwargs中删除参数,例如在调用超类方法之前,请使用d.pop。


Note that in def get(self, *args, raw=False, vars=None):, the raw=False and vars=None have nothing to do with keyword arguments. Those are default argument values. Arguments with a default value may be passed positionally, and arguments without a default value may be passed by keyword:

请注意,在def get(self,* args,raw = False,vars = None):中,raw = False和vars = None与关键字参数无关。这些是默认参数值。具有默认值的参数可以按位置传递,而没有默认值的参数可以通过关键字传递:

def f(a=1): pass
f(2)  # works, passing a positionally
def f(a): pass
f(a=2)  # works, passing a by keyword

Similarly, keyword-only arguments are not required to have a default value. Coming after the *args argument is what marks them as keyword-only, not the presence of a default value:

同样,仅关键字参数不需要具有默认值。在* args参数之后,将它们标记为仅关键字,而不是存在默认值:

def f(*args, a): pass
# a is a mandatory, keyword-only argument

#2


42  

Python's syntax doesn't allow variable args in function and keyword arguments with default value at the same time. If you must have keyword arguments along with arbitrary number of positional arguments, you need to allow arbitrary number of keyword arguments as well.

Python的语法不允许函数和关键字参数中的变量args同时具有默认值。如果必须具有关键字参数以及任意数量的位置参数,则还需要允许任意数量的关键字参数。

This is a common pattern to provide default values for keyword arguments, as well as allowing any number of positional arguments:

这是为关键字参数提供默认值以及允许任意数量的位置参数的常见模式:

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)

If you don't use the extra keyword arguments at all, you have nothing to worry about. This makes the function a bit less self-documenting, which you can make up with a properly written docstring.

如果您根本不使用额外的关键字参数,则无需担心。这使得函数的自我记录变得更少,您可以使用正确编写的文档字符串来弥补。