17

デフォルト値の関数パラメータが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でしかできないことですか?

ありがとう

4

5 に答える 5

15

慣習はしばしば使用arg=Noneして使用することです

def foo(arg=None):
    if arg is None:
        arg = "default value"
        # other stuff
    # ...

合格したかどうかを確認します。ユーザーが を渡すことを許可します。これは、引数が渡されなかっNoneたかのように解釈されます。

于 2008-11-01T06:17:54.533 に答える
11

「名前付きパラメータ」と言うときは、「キーワード引数」を意味していると思います。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の呼び出し規約を完全にエミュレートすることができます。この場合、引数は位置または名前のいずれかで指定でき、引数を複数回(位置と名前で)指定するとエラーが発生します。

于 2008-11-01T02:45:13.463 に答える
4

あなたはこのようにそれを行うことができます:

def isdefarg(*args):
    if len(args) > 0:
        print len(args), "arguments"
    else:
        print "no arguments"

isdefarg()
isdefarg(None)
isdefarg(5, 7)

詳細については、呼び出しに関するPythonのドキュメントを参照してください。

于 2008-11-01T02:34:46.123 に答える
2

あなたが何を望んでいるかを完全に理解しているかどうかはわかりません。でも:

def fun(arg=Ellipsis):
    if arg is Ellipsis:
        print "No arg provided"
    else:
        print "arg provided:", repr(arg)

それはあなたが望むことをしますか?そうでない場合は、他の人が示唆しているように、関数を*args, **kwargs構文で宣言し、kwargs dict でパラメーターの存在を確認する必要があります。

于 2008-11-01T03:19:07.063 に答える
1
def f(one, two=2):
   print "I wonder if", two, "has been passed or not..."

f(1, 2)

これがあなたの質問の正確な意味である場合、デフォルト値にあった2と渡された2を区別する方法はないと思います。検査モジュールでも、そのような区別を実現する方法が見つかりませんでした。

于 2008-11-01T02:58:41.423 に答える