删除后我从哪里访问__name__?

时间:2018-03-24 19:44:09

标签: python python-3.x module

在我的Python Shell中,删除benzoUpdate searchMsg ({meds} as model) = { model | meds = { meds | benzo = Input.updateSelection searchMsg meds.benzo } , selectedMed = case Input.selected meds.benzo of Nothing -> NoneChosen Just benzo -> Stage1 benzo } |> updateCurrentMedDose updateCurrentMedDose model = { model | dose = (dosing (Maybe.withDefault 0 model.ptWt) model.selectedMed) } 会使其成为__name__。虽然,使用'builtins'检查确认我没有从某个全局变量引用globals

__name__

我的猜测是我们从一些关闭中使用它。这种行为是如何发生的?

2 个答案:

答案 0 :(得分:5)

首先从局部变量查找所有名称,然后查找全局变量,然后查找__builtins__,这在任何地方都可用。它就是所有内置函数的所在。

In[6]: __builtins__
Out[6]: <module 'builtins' (built-in)>
In[7]: __builtins__.__name__
Out[7]: 'builtins'
In[8]: __builtins__.len
Out[8]: <function len>

答案 1 :(得分:4)

您可以从__name__猜测,您正在访问builtins module的名称。

每当您访问变量并且在任何闭包,本地范围或全局范围中找不到该变量时,查找都会回退到内置函数。这就是为什么您可以访问minmaxtype之类的内容,即使它们不是全局变量:

>>> 'min' in globals()                                                                   
False
>>> min
<built-in function min>      
>>> __builtins__.min
<built-in function min>                                                    

同样的事情发生在__name__上。最初,在全局范围中定义了__name__变量:

>>> globals()['__name__']
'__main__'

但是一旦使用del __name__删除了该名称,全局变量中的查找将失败并返回到内置函数 - 因此您最终会得到builtins模块的名称。

>>> del __name__
>>> __name__
'builtins'
>>> __builtins__.__name__
'builtins'