学 python,熟悉 from x import y as z 的形式。那么这里的 x 和 y 是什么类型的对象?为什么一开始不设置成字符串的形式,比如
from './x' import 'y' as z # 如果这里 z 不为字符串,那么应该怎样向 import()传入参数使得 z 能被赋值?
# 或者另一种方式
from 'x' import 'y' # 在 python 库目录里寻找以 x 为名称的包
y.Function()
1
linw1995 2020-07-09 13:43:54 +08:00
没有为什么,就是这样设计的。有好想法可以提一下 pep
|
2
xiri 2020-07-09 13:51:44 +08:00
如果这里 z 不为字符串,那么应该怎样向 import()传入参数使得 z 能被赋值?
这个问题,你不知道 python 可以像下面这样搞吗? def x(): print("hello") y=x y() |
4
ipwx 2020-07-09 13:53:20 +08:00
??? 没看懂你的问题是什么。
学一样语言不要把上一个语言认为天经地义的东西代入进来,因为可能在这个语言里面根本不存在对应的概念。 |
5
lln133208 2020-07-09 13:55:56 +08:00
'x'这不是代表字符串吗?
from ‘x’ 这种写法也太反直觉了吧 |
7
crella OP @ipwx 比如 import os 这句,os 是指变量名还是符号量还是啥?这个 os 是在 python 启动时被定义在某个命名空间里的吗?
|
8
westoy 2020-07-09 14:31:58 +08:00 1
PYTHONPATH
sys.modules __import__ / importlib types.ModuleType 把这几个厘清就差不多了 |
10
ipwx 2020-07-09 17:47:29 +08:00 1
@crella
1. 最好不要每个东西都拆开来理解。import a.b.c.d / from a.b.c.d import x 这都是某种语法约定,拆开来理解没有意义的。(如果硬要追寻答案:import a.b.c.d 的话,a/b/c 至少每个肯定是 module 。d 可能是 module 也可能是 function, object 之类的。但是这是执行完这条语句之后的结果,在这条语句中没有特定意义) 2. python 遇到 import 会根据 sys.path 里面的路径依次查找模块,找到就进行导入。你可以 import sys 然后看看 sys.path 。另外 sys.path 可以受到 PYTHONPATH 环境变量的影响。 3. 导入过的模块都能在 sys.modules 中找到。如果一个模块已经被导入了一次,那么第二次 import 它不会产生第二次导入,只是把这个 sys.modules 里面的这个模块对象给你拿出来。这也是为啥我说拆开看 import 里面每个符号是啥意思完全没有意义。 4. 你完全可以通过 __import__ 和 getattr 自己写一个根据字符串导入某个对象 /模块的函数。 5. 模块的类型是 types.ModuleType |
11
ipwx 2020-07-09 18:40:22 +08:00
诶等等我好像哪里说错了什么。import a.b.c.d 感觉 d 也是模块啊。。
|
12
crella OP @ipwx 我感觉疑惑的是 import 之后的参数。比如 import os 里的 os,按你的说法,os 的类型是 module,但是在 import 之前执行 os 或者 type(os),都报错:os 这个名称未定义,那么为什么在 import 语句里就能识别出 os 是一个 module 的名称呢?
在这个问题上我是有点钻牛角尖,这个超出了我对面向对象编程知识的认知,所以才好奇问一下。反正不影响实际使用。 |