是否有 Python 内置方法来检查整数是否为二进制格式?
Is there a Python built-in method that checks if an integer is in binary format or not?
我知道实现我自己的背后的逻辑,但是有一个 内置 Python 函数接受一个整数,如果是 returns 则为 True写成二进制形式?
例如,is_binary(0b1010)
会 return True
但 is_binary(12)
会 return False
.
不,因为 0b1010
被 'compiler' 转换为与 10
相同的表示形式,这当然发生在它被传递给函数之前很久。
我们可以通过调查生成的代码来确认这一点。
import dis
def binary():
a = 0b1010
def base_10():
a = 10
dis.dis(binary)
print()
dis.dis(base_10)
产出
17 0 LOAD_CONST 1 (10) # <-- Same represntation here
2 STORE_FAST 0 (a)
4 LOAD_CONST 0 (None)
6 RETURN_VALUE
20 0 LOAD_CONST 1 (10) # <-- as here
2 STORE_FAST 0 (a)
4 LOAD_CONST 0 (None)
6 RETURN_VALUE
如果它对你来说那么重要,你将不得不实施某种 AST parser,我 假设 将能够在它被执行之前获取二进制文字已转换。
如果你真的需要这样的功能并且不关心性能,你可以标记源:
scenox@Mac ~ % echo 'print(0b1010)' | python3 -m tokenize
1,0-1,5: NAME 'print'
1,5-1,6: OP '('
1,6-1,12: NUMBER '0b1010'
1,12-1,13: OP ')'
1,13-1,14: NEWLINE '\n'
2,0-2,0: ENDMARKER ''
所以你可以这样做:
g = tokenize(BytesIO(somestring.encode('utf-8')).readline) # tokenize the string
for toknum, tokval, _, _, _ in g:
if toknum == NUMBER and tokval.startswith('0b'):
...
我知道实现我自己的背后的逻辑,但是有一个 内置 Python 函数接受一个整数,如果是 returns 则为 True写成二进制形式?
例如,is_binary(0b1010)
会 return True
但 is_binary(12)
会 return False
.
不,因为 0b1010
被 'compiler' 转换为与 10
相同的表示形式,这当然发生在它被传递给函数之前很久。
我们可以通过调查生成的代码来确认这一点。
import dis
def binary():
a = 0b1010
def base_10():
a = 10
dis.dis(binary)
print()
dis.dis(base_10)
产出
17 0 LOAD_CONST 1 (10) # <-- Same represntation here
2 STORE_FAST 0 (a)
4 LOAD_CONST 0 (None)
6 RETURN_VALUE
20 0 LOAD_CONST 1 (10) # <-- as here
2 STORE_FAST 0 (a)
4 LOAD_CONST 0 (None)
6 RETURN_VALUE
如果它对你来说那么重要,你将不得不实施某种 AST parser,我 假设 将能够在它被执行之前获取二进制文字已转换。
如果你真的需要这样的功能并且不关心性能,你可以标记源:
scenox@Mac ~ % echo 'print(0b1010)' | python3 -m tokenize
1,0-1,5: NAME 'print'
1,5-1,6: OP '('
1,6-1,12: NUMBER '0b1010'
1,12-1,13: OP ')'
1,13-1,14: NEWLINE '\n'
2,0-2,0: ENDMARKER ''
所以你可以这样做:
g = tokenize(BytesIO(somestring.encode('utf-8')).readline) # tokenize the string
for toknum, tokval, _, _, _ in g:
if toknum == NUMBER and tokval.startswith('0b'):
...