2017-09-09 3 views
0

내장 함수 len의 정의를 변경 한 다음 ctypes module.But을 가져 오려고했는데 왜 그랬는지 알지 못합니다. 여기에ctypes를 가져올 때 왜 잘못되었는지 알 수 없습니다.

import builtins 

def func(obj): 
    print("Length: %d" % len(obj)) 
builtins.len = lambda obj: "Bad!!!" 

import ctypes 

오류의 tracback입니다 : 문서라도 내 코드입니다

Traceback (most recent call last): 


    File "<stdin>", line 1, in <module> 
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 673, in _load_unlocked 
    File "<frozen importlib._bootstrap_external>", line 661, in exec_module 
    File "<frozen importlib._bootstrap_external>", line 772, in get_code 
    File "<frozen importlib._bootstrap_external>", line 491, in _code_to_bytecode 
    File "<frozen importlib._bootstrap_external>", line 42, in _w_long 
ValueError: invalid literal for int() with base 10: 'Bad!!!' 
Error in sys.excepthook: 
Traceback (most recent call last): 
    File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 53, in apport_excepthook 
    if not enabled(): 
    File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 24, in enabled 
    import re 
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 673, in _load_unlocked 
    File "<frozen importlib._bootstrap_external>", line 661, in exec_module 
    File "<frozen importlib._bootstrap_external>", line 772, in get_code 
    File "<frozen importlib._bootstrap_external>", line 491, in _code_to_bytecode 
    File "<frozen importlib._bootstrap_external>", line 42, in _w_long 
ValueError: invalid literal for int() with base 10: 'Bad!!!' 

Original exception was: 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 673, in _load_unlocked 
    File "<frozen importlib._bootstrap_external>", line 661, in exec_module 
    File "<frozen importlib._bootstrap_external>", line 772, in get_code 
    File "<frozen importlibbootstrap_external>", line 491, in _code_to_bytecode 
    File "<frozen importlib._bootstrap_external>", line 42, in _w_long 
ValueError: invalid literal for int() with base 10: 'Bad!!!' 

이 날 많은 퍼즐. 누군가가 나를 도울 수 있으면 대단히 감사합니다!

+1

왜 의아해하니? 기본적으로 많이 사용되는 기본 내장 함수의 기능을 변경 한 다음 의도 한대로 (간접적으로 가져 오기를 통해) 사용하려고하면 오류가 발생해야합니까? – jedwards

+0

ctypes를 가져 왔을 때 변경된 len 함수가 실행되었다는 것을 의미합니까? @jedwards –

+0

변경된 len 재미는 ctypes를 가져 오려고 할 때 분명히 호출됩니다 ('ValueError : 밑이 10 인 int()에 대한 리터럴이 잘못되었습니다 :'Bad !!! '). 나는 ctypes의 버전이 미래 패키지에 대한 의존성을 가지지 않는 한, 왜 그런지는 모르겠다. – jedwards

답변

1

len 함수가 정수가 아닌 문자열을 반환하기 때문입니다.

builtins.len = lambda obj: "123" 

그것을 보려면 다음과 같이 코드를 업데이트

>>> int("I should know playing with builtins is always a bad thing") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 'lol' 

시도 :

당신은 당신이 할 수 동일한 행동을 달렸다.

+0

그것은 작동합니다! 고맙습니다! –

관련 문제