문제

기본값이있는 함수 매개 변수가 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 구문도 파이썬 호출 규칙을 완전히 모방 할 수 있으며, 여기서 인수는 위치 또는 이름으로 제공 될 수 있으며 (위치와 이름으로) 여러 번 제공되는 인수는 오류를 유발합니다.

다른 팁

컨벤션은 종종 사용됩니다 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)

파이썬 문서를 참조하십시오 전화 전체 정보.

def f(one, two=2):
   print "I wonder if", two, "has been passed or not..."

f(1, 2)

이것이 귀하의 질문의 정확한 의미라면, 기본값에 있었던 2와 통과 된 2를 구별 할 방법이 없다고 생각합니다. 나는 심지어 그러한 구별을 달성하는 방법을 찾지 못했습니다. 검사 기준 치수.

내가 원하는 것이 무엇인지 완전히 이해해도 확실하지 않습니다. 하지만:

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