2017-09-09 44 views
0

我改變了內置函數len的定義,然後我試圖導入ctypes模塊。但我不知道爲什麼它會出現錯誤,當我這樣做時。這裏是我的代碼:我不知道爲什麼它是錯誤的,當我導入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

當您嘗試導入ctypes時,更改的len樂趣肯定會被調用(請參見ValueError:對於int(),其基數爲10:'Bad !!!')。我不知道爲什麼,除非版本的ctypes依賴於未來的包。 – jedwards

回答

1

因爲你的len函數返回非整數字符串。

你只跑了完全相同的行爲,你可以有:

>>> 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' 

嘗試更新喜歡你的代碼:

builtins.len = lambda obj: "123" 

看到它。

+0

它的工作原理!謝謝! –

相關問題