파이썬에서 0xbin ()이 False를 반환하는 이유는 무엇입니까? [복제]
이 질문에는 이미 답변이 있습니다.
- 파이썬에서 왜 구문 오류가 아닌가? 답변 3 개
명령을 입력하면 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
그런 다음 토큰 화하고 일련의 namedtuple
s를 리턴합니다 . 우리는 각각을 나타내는 문자열을 가져 와서 공백으로 결합합니다. 이 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
'IT' 카테고리의 다른 글
배치 파일에서 매개 변수가 비어 있는지 테스트하는 올바른 방법은 무엇입니까? (0) | 2020.05.12 |
---|---|
파이썬에서 인덱스를 사용하여 목록 반복 (0) | 2020.05.12 |
Java의 클래스 경로에서 자원을로드하는 URL (0) | 2020.05.12 |
양식 데이터를 JSON으로 직렬화 (0) | 2020.05.12 |
Javascript를 사용하여 현재 도메인 이름 가져 오기 (경로 등이 아님) (0) | 2020.05.12 |