2017-01-19 12 views
-5

これが私のコードです:TypeError例外:楽しい()かかり、少なくとも2つの引数(与えられた3)

def fun(x, y, b=None, c=None): 
    print(x,' ',y,' ',b,' ',c) 

は私がfun(1, b=2, c=4)としてそれを呼び出すと、エラーTypeError: fun() takes at least 2 arguments (3 given)を取得しています。 このエラーは、位置およびキーワードの引数の数が正しくないことが原因であることがわかりました。

私は間違った番号で私の機能を呼び出すたびに私はしたい。どの議論が提供されているか教えてください。 たとえば、上記の場合、「引数yは提供されていません」のようなものです。

この目的のためにデコレータを書くことはできますか?

+1

そうでない場合、我々は助けることができないあなたのコードを投稿してください。 –

+0

代わりに何をしたいかは不明です。 「このエラーを処理し、これらの(名前)定位置引数を必要とするようなエラーを表示したい」と明確にしてください。 –

答えて

0

I want to handle this error and prompt error like it requires these (names) positional arguments. Is it possible to write a decorator for this?

私は少しの研究を行い、inspectモジュールを見つけました。おそらく、これらの線に沿った何かで十分でしょうか?今私はTypeErrorを捕まえてメッセージを印刷していますが、代わりにメッセージを含む新しいTypeErrorを投げることをお勧めします。

import inspect 
from functools import wraps 


def inspect_signature(f): 
    signature = inspect.signature(f) 

    @wraps(f) 
    def decorator(*args, **kwargs): 
     try: 
      f(*args, **kwargs) 
     except TypeError: 
      print('Failed to call "{}" with signature {}. Provided args={} and kwargs={}.'.format(
       f.__name__, signature, args, kwargs)) 

    return decorator 


@inspect_signature 
def func(foo, bar): 
    print('Called successfully with foo={}, bar={}'.format(foo, bar)) 
    pass 


if __name__ == '__main__': 
    func(foo='a', bar='b') 
    func(foo='a') 
    func('a', 'b', 'c') 

出力

Called successfully with foo=a, bar=b 
Failed to call "func" with signature (foo, bar). Provided args=() and kwargs={'foo': 'a'}. 
Failed to call "func" with signature (foo, bar). Provided args=('a', 'b', 'c') and kwargs={}. 
+0

私はPython 2.7を使用しています。 inspect.signature()をサポートしていません –

+0

@python_user(1)Python 2を使わないでください。 (2) 'inspect.getargspec'はどうですか?私はそれを最初に試みたが、それは非難されたと言った。 – Tagc

+0

もう一つ、関数の署名を保存するにはどうすればいいですか? –

2

fun定義されているように、2つの必須引数と2つのオプション引数を持つため、2〜4引数を取得する必要があります。あなたは、2つの必須のもののいずれかを提供していませんでした:

fun(1, b=2, c=4) # What about the argument y? 

あなたは、次のいずれかの形式を使用して、それを呼び出す必要があります:

fun(1, 2) 
fun(1, 2, b=3) 
fun(1, 2, c=4) 
fun(1, 2, b=3, c=4) 

あなたが不十分な引数に関する通知をしたい場合は、することができますargskwargsを使用します。

def fun(*args, **kwargs): 

    if len(args) < 2: 
     print("Need at least two arguments!"); return 
    if len(args) > 2 or len(kwargs) > 2: 
     print("Too much arguments supplied!"); return 

    x, y = args 
    a, b = kwargs.get('a', None), kwargs.get('b', None) 

    print(x, y, a, b) 
関連する問題