我想知道如果将其表示为object.attribute语法,则该名称是否算作名称。动机来自尝试从学习Python理解此代码:
def makeopen(id):
original = builtins.open
def custom(*pargs, **kargs):
print('Custom open call %r' %id, pargs, kargs)
return original(*pargs,*kargs)
builtins.open(custom)
我想将每个名称/变量映射到它们存在的范围。我不确定该如何处理buildins.open。 buildins.open是一个名称吗?在这本书中,作者确实声明了object.attribute查找遵循与纯查找完全不同的规则,这对我而言意味着buildins.open根本不是一个名称,因为执行模型文档说作用域定义了名称可见的位置。由于object.attribute语法在任何范围内都是可见的,因此它不适合此分类,也不是名称。
但是,我遇到的概念性问题是然后定义了什么builtins.open是什么?它仍然是对一个对象的引用,并且可以反弹到任何其他对象。从这个意义上说,它是一个名称,即使它不遵循范围规则?
谢谢。
答案 0 :(得分:1)
builtins.open
只是访问全局open
函数的另一种方式:
import builtins
print(open)
# <built-in function open>
print(builtins.open)
# <built-in function open>
print(open == builtins.open)
# True
来自docs:
该模块可直接访问所有“内置”标识符 蟒蛇;例如,
builtins.open
是内置的全名 函数open()
关于您问题的第二部分,我不确定您的意思。 (几乎)Python中的每个“名称”都可以重新分配给完全不同的名称。
>>> list
<class 'list'>
>>> list = 1
>>> list
1
但是,builtins
下的所有内容均受到保护,否则,如果有人(事物)在运行时重新分配了其属性,必然会发生一些令人讨厌的怪异行为。
>>> import builtins
>>> builtins.list = 1
Traceback (most recent call last):
File "C:\Program Files\PyCharm 2018.2.1\helpers\pydev\_pydev_comm\server.py", line 34, in handle
self.processor.process(iprot, oprot)
File "C:\Program Files\PyCharm 2018.2.1\helpers\third_party\thriftpy\_shaded_thriftpy\thrift.py", line 266, in process
self.handle_exception(e, result)
File "C:\Program Files\PyCharm 2018.2.1\helpers\third_party\thriftpy\_shaded_thriftpy\thrift.py", line 254, in handle_exception
raise e
File "C:\Program Files\PyCharm 2018.2.1\helpers\third_party\thriftpy\_shaded_thriftpy\thrift.py", line 263, in process
result.success = call()
File "C:\Program Files\PyCharm 2018.2.1\helpers\third_party\thriftpy\_shaded_thriftpy\thrift.py", line 228, in call
return f(*(args.__dict__[k] for k in api_args))
File "C:\Program Files\PyCharm 2018.2.1\helpers\pydev\_pydev_bundle\pydev_console_utils.py", line 217, in getFrame
return pydevd_thrift.frame_vars_to_struct(self.get_namespace(), hidden_ns)
File "C:\Program Files\PyCharm 2018.2.1\helpers\pydev\_pydevd_bundle\pydevd_thrift.py", line 239, in frame_vars_to_struct
keys = dict_keys(frame_f_locals)
File "C:\Program Files\PyCharm 2018.2.1\helpers\pydev\_pydevd_bundle\pydevd_constants.py", line 173, in dict_keys
return list(d.keys())
TypeError: 'int' object is not callable