IT

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

lottoking 2020. 5. 12. 08:25
반응형

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


이 질문에는 이미 답변이 있습니다.

명령을 입력하면 0xbin()False가 반환됩니다.

>>> 0xbin()
False

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


파이썬은로 해석 0xbin()되는 것 같습니다 0xb in (). 의미는 빈 튜플에서 11입니다. 따라서 대답은 '아니요' False입니다.


코드를 분해하면 로 해석 되는 Yself 's answer 가 확인됩니다.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 ( 0xb)이 빈 튜플 ( ())에 없기 때문에 False를 반환합니다 .

(의견에 사용을 제안한 Roman Odaisky에게 감사합니다 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())
                                         ]
                            ))])'

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

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

반응형