python中的object.attribute语法是否算作名称?

时间:2018-11-28 14:01:16

标签: python-3.x

我想知道如果将其表示为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是什么?它仍然是对一个对象的引用,并且可以反弹到任何其他对象。从这个意义上说,它是一个名称,即使它不遵循范围规则?

谢谢。

1 个答案:

答案 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