2016-04-13 10 views
1

なぜこれは構文エラーですか?このことを行う適切な方法は何ですか? *argsは、関数呼び出しの署名のいずれかの不履行/名前付き引数の後に現れなければならないのpython 2でサポートされていないPython構文エラー*オプションの引数を持つargs

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

答えて

4

Python 2には、キーワードのみの引数がサポートされていません。あなたが本当に唯一のキーワードで渡すことができる引数を持っているあなたのPython 2の機能が必要な場合は、**kwargsを取ると、キーワード引数を自分で検証する必要があります:Pythonの2で

def my_max(*args, **kwargs): 
    '''Emulate the built-in max, including the keyword-only key argument.''' 
    key = kwargs.pop('key', None) 
    if kwargs: 
     raise TypeError('my_max() got an unexpected keyword argument {!r}'.format(next(iter(kwargs)))) 
    if key is None: 
     # max doesn't support key=None 
     return max(*args) 
    else: 
     return max(*args, key=key) 
2

これを行う適切な方法は、サポートされているpython 3にアップグレードすることです。

>>> def f(*args, option=None): 
...  print(args, option) 
...  
>>> f('not_option') 
('not_option',) None 
>>> f(1, 2, option='beast mode on!!!') 
(1, 2) beast mode on!!! 
2

、すべての位置引数は、任意の*argsの前に来なければなりません引数。 Python 3では、あなたの現在の構文は合法で、 "keyword-only"引数としてoptionを作成します。

def f(option=None, *args): 
    ... 

あなたがが任意の追加の引数を提供したい場合、これはoption引数を提供するために、あなたを必要とする、あなたが望むものではないかもしれない:

だから、あなたのオプションは、引数の順序を変更することがあり。

もう1つのオプションは、関数に渡されたキーワード引数をキャッチするために、**kwargs構文を使用することです。それはoption(およびない他の予期しないキーワード)を持っている場合は、位置引数として名前を付けずに確認することができます。

def f(*args, **kwargs): 
    option = kwargs.pop("option", None) 
    if kwargs: 
     raise TypeError("unexpected keyword arguments found: {}".format(kwargs)) 
    ... 

それとも

のPython 3にアップグレードすることができ
関連する問題