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 に組み込まれています。)

とにかくそれを本当にやりたい場合は、次のようにします(引数の部分のみ):

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 に答える