[英]Why can you assign values to built-in functions in Python?
我今天偶然發現了這個,當我注意到一段Python代碼使用了內置函數 all
作為變量標識符來存儲列表理解的結果並且它沒有拋出錯誤,所以我嘗試了以下:
type('abc')
Out[1]: str
type('abc') == str
Out[2]: True
str = int
type('abc') == str
Out[4]: False
type('abc')
Out[5]: str
type = [1,2,3]
type('abc')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-a74a7df76db1> in <module>()
----> 1 type('abc')
TypeError: 'list' object is not callable
希望,當我問為什么在Python中允許這種行為時,這是一個有效的問題。
或者更好的是,我如何確保像str
這樣的內置函數真的是str
而不是說int
因此str(123)
不會被意外地評估為int(123)
?
Python希望您對代碼負責,這就是原因。 Python沒有私有屬性,沒有受保護的類,幾乎沒有限制你可以使用的名稱。
是的,這意味着您可能會意外地重命名內置內容。 為您的代碼創建單元測試,使用linter,通常,您將很快學會發現意外使用您需要的內置代碼。 與您在代碼中意外重復使用任何其他名稱沒有什么不同。
請注意,您只是屏蔽了內置名稱; 名稱查找無法在內置命名空間中找到全局下一個查看,因此如果將str
設置為其他內容,則會在內置命令之前找到。 只需刪除全局:
>>> str = 'foobar'
>>> isinstance('foobar', str)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
>>> del str
>>> isinstance('foobar', str)
True
另一種方法是使每個內置名稱都成為一個保留關鍵字,這樣你就可以獲得一個允許的名稱列表,並且沒有靈活性來重新定義這些對象。 例如,Python 2.7有144個這樣的名字。
在這種情況下,請參閱Guido van Rossum撰寫的這篇博文 ,了解為什么None
, True
和False
現在是Python 3中的關鍵字 :
因為你不能在任何Python程序中的任何地方使用它們作為變量或函數名稱,所以使用Python的每個人都必須知道語言中的所有保留字,即使它們不需要它們。 出於這個原因,我們試圖保留較小的保留字列表,並且在向該語言添加新的保留字之前,核心開發人員會出現問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.