在 Python 中,点.用于写入模块的路径(例如path.to.mod.func()),但也用于选择成员函数(如果x是类型T,x.func()则是语法糖T.func(x)),据我所知。假设我有
# Module which contains a function `sort()`
import mod
# Object of `list` type, which contains `sort()` as a member functin
mod = [3,2,1]
x = mod.sort() # Now what?
Run Code Online (Sandbox Code Playgroud)
最后一行会发生什么?如果以点分隔的标识符列表是:函数的模块/类路径,或者是(以点分隔的标识符)对象,然后是点,然后是该对象类中的成员函数,python 如何消除歧义?不知道我说清楚了没有。
在我看来,python 如何解析这样的表达式有点含糊不清。例如,诸如 C++ 或 rust(以及许多其他语言)之类的语言::用于分隔模块路径以及.分隔对象标识符和成员函数/成员变量。为什么 python 能够.明确地用于这两个目的?在 python 中会发生什么,为什么?
我希望我说清楚了。
在import语句之外,点始终表示“属性访问”。无论mod绑定到什么,无论是模块还是列表,都mod.sort指向sort对象mod引用的属性。赋值mod改变了它所指的module对象,从一个对象变成了一个list对象。
模块和其他对象没有单独的命名空间:mod可以引用module或list,而不是两者。
点有点特殊的唯一地方是在import像这样的语句中
import foo.bar.baz
Run Code Online (Sandbox Code Playgroud)
进行import语句而不是函数调用的目的是模块路径不必是 Python 表达式,这意味着虚线路径的语义可以是import语句唯一的。在这种情况下,foo.bar.baz假定是一个路径,如foo/bar/baz.py或foo/bar/baz/__init__.py,相对于 中的目录sys.path。语法的选择预期这样一个事实,即在此语句执行后,名称foo将引用一个包模块,该模块将具有一个bar引用子包的属性,该子包将具有一个baz引用 中的模块的属性foo.bar。
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |