簡體   English   中英

為什么可以在Python中為內置函數賦值?

[英]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撰寫的這篇博文 ,了解為什么NoneTrueFalse現在是Python 3中的關鍵字

因為你不能在任何Python程序中的任何地方使用它們作為變量或函數名稱,所以使用Python的每個人都必須知道語言中的所有保留字,即使它們不需要它們。 出於這個原因,我們試圖保留較小的保留字列表,並且在向該語言添加新的保留字之前,核心開發人員會出現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM