sourcetip

파이썬에서 0xbin()이 False를 반환하는 이유는 무엇입니까?

fileupload 2023. 7. 2. 20:56
반응형

파이썬에서 0xbin()이 False를 반환하는 이유는 무엇입니까?

명령 입력0xbin()False를 반환합니다.

>>> 0xbin()
False

왜 그런 일이 일어날까요?이 구문은 아무런 의미가 없어야 합니다.함수는 0으로 시작할 수 없으며 16진수에 "i"와 "n"이 없으며 bin 함수에는 몇 가지 인수가 있어야 합니다.

2023 업데이트: 이것은 곧 구문 오류가 될 것으로 예상됩니다.

파이썬이 해석하는 것 같습니다.0xbin()~하듯이0xb in ()의미는 빈 튜플에서 11입니다.답은 아니오입니다, 그러므로.False.

코드를 분해하면 Yself의 답을 볼 수 있습니다. Yself는 다음과 같이 말합니다.0xbin()로 해석됩니다.0xb in ()확인됨:

>>> import dis
>>> dis.dis('0xbin()')
  1           0 LOAD_CONST               0 (11)
              2 BUILD_TUPLE              0
              4 COMPARE_OP               6 (in)
              6 RETURN_VALUE

Python 자체 토큰화기를 사용하여 확인할 수 있습니다!

import tokenize
import io
line = b'0xbin()'
print(' '.join(token.string for token in tokenize.tokenize(io.BytesIO(line).readline) if token.type!=59))

이렇게 하면 문자열의 토큰이 공백으로 구분되어 인쇄됩니다.이 경우 결과는 다음과 같습니다.

0xb in ( ) 

즉, 숫자 11이 False를 반환합니다.0xb)가 빈 튜플에 없습니다(()).

(로맨 오다이스키가 사용을 제안해 준 것에 감사드립니다.tokenize댓글에!)

편집: 코드를 조금 더 자세히 설명하자면:tokenize함수는 약간 이상한 형식의 입력을 기대합니다.io.BytesIO(line).readline일련의 바이트를 어떤 것으로 바꾸는 함수입니다.tokenize읽을 수 있습니다. tokenize그런 다음 토큰화하고 일련의 데이터를 반환합니다.namedtuples; 우리는 각각을 나타내는 문자열을 가져다가 공간과 함께 결합합니다.type != 59부품은 시작 부분에 표시되는 인코딩 지정자를 무시하는 데 사용됩니다.

AST 모듈을 사용하여 식의 추상 구문 트리를 가져올 수 있습니다.

>>> import ast
>>> m = ast.parse('0xbin()')
>>> ast.dump(m)
'Module(
    body=[Expr(
               value=Compare(left=Num(n=11),
                             ops=[In()],
                             comparators=[Tuple(elts=[],
                                                ctx=Load())
                                         ]
                            ))])'

표현을 해석하는 방법은 추상 문법을 참조하십시오. buttl;dr:Num(n=11)그것은0xb부분, 그리고Tuple(elts=[], ...)함수 호출이 아닌 빈 튜플에 대한 힌트입니다.

언급URL : https://stackoverflow.com/questions/51521158/in-python-why-does-0xbin-return-false

반응형