0

我想知道如果将某些东西表示为 object.attribute 语法,它是否算作名称。动机来自于尝试从 Learning 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)

我想将每个名称/变量映射到它们存在的范围内。我不确定如何处理 builtins.open。builtins.open 是一个名字吗?在书中作者确实指出 object.attribute 查找遵循与普通查找完全不同的规则,这对我来说意味着 builtins.open 根本不是一个名称,因为执行模型文档说范围定义了名称可见的位置。由于 object.attribute 语法在任何范围内都是可见的,因此它不适合此分类并且不是名称。

然而,我遇到的概念问题是定义什么是 builtins.open ?它仍然是对对象的引用,并且可以重新绑定到任何其他对象。从这个意义上说,它是一个名称,即使它不遵循范围规则?

谢谢你。

4

1 回答 1

1

builtins.open只是访问全局open函数的另一种方法:

import builtins

print(open)
#  <built-in function open>
print(builtins.open)
#  <built-in function open>
print(open == builtins.open)
#  True

文档

该模块提供对 Python 的所有“内置”标识符的直接访问;例如,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
于 2018-11-28T14:05:28.187 回答