質問

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でパラメーターの存在を確認する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top