1

所以我创建了一个转置函数,它可以选择添加列标题,我相信我在 python 中遇到了一个错误并使用 *args:

>>> def transpose(*args,header=None):
  File "<stdin>", line 1
    def transpose(*args,header=None):
                        ^
SyntaxError: invalid syntax

所以是的,因为 *args 用于任意数量的值,所以你不能在它后面放任何东西,你应该可以放variable=value,因为那个变量有一个自动赋值,使它与 *args 分开,因为你会用它来调用它header=['col1','col2','col3']等等

以下不会出错:

def transpose(header=None,*args):
    #code goes here

唯一的问题是,这使得函数的第一个输入被分配给标题而不需要做header=valueheader需要输入,这不是我想要的,我敢肯定不是很多人使用任意创建函数想要的值的数量。

有了这个错误,似乎不可能有一个使用*args和输入不是要求的函数。这是python中的错误吗?

注意:我使用的是python2.7,所以如果它是一个错误,它很可能只是那个版本中的一个错误

4

2 回答 2

5

简短的 python 2.x 答案是“不要那样做”。:-) (正如@Bakurui 所说,它内置于 Python 3.x 中。)

如果你真的想这样做,这就是方法(只是 args 部分):

def transpose(*args, **kwargs):
    header = kwargs.pop('header', None)
    if kwargs:
        raise TypeError('unexpected keyword args to transpose()')
    print 'transpose: args:', args
    print 'transpose: header:', header
于 2013-06-08T17:26:41.570 回答
4

在 python 2 中,没有关键字只有参数。所有参数都是位置参数,您可以为它们分配默认值。这意味着对于任何函数,您必须能够仅使用位置参数指定任何参数。在你的定义中,你不能给一个值,header因为*args它消耗了所有的位置参数,因此它不是一个有效的函数定义。

在 python3中只有关键字参数:

$ python3
Python 3.2.3 (default, Oct 19 2012, 19:53:57) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def transpose(*args, header=None): pass
... 
>>> 

请注意,您还可以执行以下操作:

>>> def transpose(*args, header): pass
... 
>>> transpose(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: transpose() needs keyword-only argument header

如您所见,这与是否具有默认值无关。语法和语义随着 python3 的变化而改变。

于 2013-06-08T17:17:24.803 回答