괄호가 있거나없는 파이썬 주장


104

다음은 assert의 네 가지 간단한 호출입니다.

>>> assert 1==2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError

>>> assert 1==2, "hi"
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError: hi

>>> assert(1==2)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AssertionError

>>> assert(1==2, "hi")

마지막 항목은 오류를 발생시키지 않습니다. 이 동작을 일으키는 괄호가 있거나없는 assert 호출의 차이점은 무엇입니까? 내 연습은 괄호를 사용하는 것이지만 위의 내용은 괄호를 사용하지 않아야 함을 시사합니다.


유용한 답변에 감사드립니다. 키워드와 내장 함수의 차이는 미묘 해 보입니다. 다음은 괄호를 생략해야하는 키워드 목록입니다. docs.python.org/reference/lexical_analysis.html#keywords
gaefan

2
한 가지 차이점은 내장 함수를 재정의 할 수는 있지만 키워드로는 그렇게 할 수 없다는 것입니다 (전자는 좋은 생각이 아닙니다).
개판 2010-06-24

함수 대 키워드 구분이 아니라 함수 호출 입니다. (예를 들어-print는 예전에는 문장이었고 괄호없이 작동했습니다).
Tomasz Gandor 2018

답변:


129

마지막 assertSyntaxWarning: assertion is always true, perhaps remove parentheses?IDLE이 아닌 전체 통역사를 통해 실행 한 경우 경고 ( )를 제공했을 것입니다. assert은 함수가 아니라 키워드 이기 때문에 실제로 튜플을 첫 번째 인수로 전달하고 두 번째 인수는 그대로 둡니다.

비어 있지 않은 튜플은 다음과 같이 평가됩니다. True 어설 션 메시지는 선택 사항이므로 기본적으로를 assert True작성할 때 호출했습니다 assert(1==2, "hi").


10
이유는 assert (1==2)단일 표현식 주위의 괄호가 자동으로 튜플을 생성 하지 않기 때문입니다 . 만약 당신이했다면 # 4와 같은 행동을하게 될 것 assert (1==2,)입니다. print ('foo', 'bar')대신에 했다면 같은 일이 일어날 것입니다 print 'foo', 'bar'; 출력 된 튜플을 볼 수 있습니다
Michael Mrozek 2010-06-24

형식의 진술이 assert(test, message)아마도 잘못되었을 수 있고 확실히 혼란 스러울 수 있다는 점을 더 강조 할 가치가 있습니다. 괄호가 없습니다!
tcarobruce 2010 년

19
그렇다면 긴 assert 문 wrt PEP8을 들여 쓰는 적절한 방법은 무엇입니까? 불가능 해 보인다.
stantonk 2013


30

여러 줄 어설 션을 원했기 때문에 괄호를 넣으면 다음과 같이 줄 끝에 백 슬래시를 넣는 것이 대안입니다.

foo = 7
assert foo == 8, \
    "derp should be 8, it is " + str(foo)

인쇄물:

AssertionError: "derp should be 8, it is 7

이 파이썬은 왜 assert 이 다른 모든 것과 다른

비단 법적인 이데올로기는 어설 션을 켜는 특수 플래그에 대해 걱정할 필요없이 프로그램이 자체 수정해야한다는 것입니다. 어설 션을 끄려는 유혹이 너무 커서 더 이상 사용되지 않습니다.

나는 당신의 성가심을 공유합니다. assert 이 다른 모든 파이썬 프로그래밍 구조에 비해 고유 한 구문을 가지고 있으며,이 구문은 아직 python2에서 python3으로 다시 변경되었고 다시 파이썬 3.4에서 3.6으로 변경 . 모든 버전에서 다른 버전으로 이전 버전과 호환되지 않는 assert 문을 만듭니다.

assert3 급 시민 인 어깨를 두드리면 python4에서 완전히 제거되고 Python 8.1에서는 확실히 다시 제거됩니다.


2
어설 션 대신 사용해야하는 것에 대한 문서가 있습니까? Assert는 유효성 검사를위한 논리적 이름처럼 보이며 원하는 동작을 가지고 있습니다 (예 : 오류시 특수 메시지 표시).
AnneTheAgile

18

assert 1==2, "hi"assert 1==2, "hi"키워드의 두 번째 매개 변수로 "hi"로 구문 분석됩니다 . 따라서 제대로 오류가 발생하는 이유입니다.

assert(1==2)단일 항목 주위의 괄호는 후행 쉼표가 없으면 튜플을 생성하지 않기 때문에와 assert (1==2)동일한 것으로 구문 분석됩니다 .assert 1==2(1==2,)

assert(1==2, "hi")assert (1==2, "hi")비어 있지 않은 튜플 (False, "hi")이 거짓 값이 아니고 키워드에 두 번째 매개 변수가 제공되지 않기 때문에 오류가 발생하지 않는 으로 구문 분석됩니다 .

assert파이썬의 함수가 아니기 때문에 괄호를 사용해서는 안됩니다 . 키워드 이기 때문 입니다.


13

다음 \과 같이 assert 문을 중단 할 수 있습니다 .

foo = 7
assert foo == 8, (
    'derp should be 8, it is ' + str(foo))

또는 더 긴 메시지가있는 경우 :

foo = 7
assert foo == 8, (
    'Lorem Ipsum is simply dummy text of the printing and typesetting '
    'industry. Lorem Ipsum has been the industry\'s standard dummy text '
    'ever since the 1500s'
)

1
흥미로운 아이디어. 나는 계속하기 위해 백 슬래시를 싫어하며 이것은 유틸리티 함수 (내 솔루션)에서 assert를 래핑하는 대안입니다.
Tomasz Gandor

1

다음은 파이썬 문서 에서 인용되었습니다.

Assert 문은 디버깅 어설 션을 프로그램에 삽입하는 편리한 방법입니다.

assert_stmt ::= "assert" expression ["," expression]

간단한 형식 인 assert 식은 다음과 같습니다. if __debug__: if not expression: raise AssertionError

확장 형식 인 assert expression1, expression2 는 다음과 같습니다. if __debug__: if not expression1: raise AssertionError(expression2)

따라서 여기에서 괄호를 사용할 때 간단한 형식을 사용 하고 표현식은 튜플로 평가되며 bool로 캐스팅 될 때 항상 True입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.