名前付きパラメーターが渡されたかどうかを判別
-
05-07-2019 - |
質問
Pythonでデフォルト値の関数パラメーターが渡されたかどうかを判断できるかどうかを知りたいです。 たとえば、dict.popはどのように機能しますか?
>>> {}.pop('test')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'pop(): dictionary is empty'
>>> {}.pop('test',None)
>>> {}.pop('test',3)
3
>>> {}.pop('test',NotImplemented)
NotImplemented
popメソッドは、最初にデフォルトの戻り値が渡されなかったことをどのように判断しますか?これはCでしかできないことですか?
ありがとう
解決
「名前付きパラメータ」と言うとき、「キーワード引数」を意味すると思います。 dict.pop()
はキーワード引数を受け入れないため、質問のこの部分は重要ではありません。
>>> {}.pop('test', d=None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pop() takes no keyword arguments
とはいえ、引数が提供されたかどうかを検出する方法は、 * args
または ** kwargs
構文を使用することです。例:
def foo(first, *rest):
if len(rest) > 1:
raise TypeError("foo() expected at most 2 arguments, got %d"
% (len(rest) + 1))
print 'first =', first
if rest:
print 'second =', rest[0]
いくつかの作業を行い、 ** kwargs
構文を使用しても、Python呼び出し規約を完全にエミュレートできます。 (位置と名前で)エラーが発生します。
他のヒント
慣例では、多くの場合、 arg = None
を使用して使用します
def foo(arg=None):
if arg is None:
arg = "default value"
# other stuff
# ...
合格したかどうかを確認します。ユーザーが None
を渡すことを許可します。これは、引数が渡されないかのように解釈されます。
次のようにできます:
def isdefarg(*args):
if len(args) > 0:
print len(args), "arguments"
else:
print "no arguments"
isdefarg()
isdefarg(None)
isdefarg(5, 7)
詳細については、呼び出しのPythonドキュメントを参照してください。
>def f(one, two=2):
print "I wonder if", two, "has been passed or not..."
f(1, 2)
これが質問の正確な意味である場合、デフォルト値にあった2と渡された2を区別する方法はないと思います。 inspectでも、そのような区別を達成する方法が見つかりませんでした。 モジュール。
あなたが何を望んでいるかを完全に理解しているかどうかはわかりません。ただし:
def fun(arg=Ellipsis):
if arg is Ellipsis:
print "No arg provided"
else:
print "arg provided:", repr(arg)
それはあなたが望むことをしますか?そうでない場合は、他の人が示唆しているように、 * args、** kwargs
構文を使用して関数を宣言し、kwargs dictでパラメーターの存在を確認する必要があります。