gpt4 book ai didi

python - 模块 "duck typing"陷阱?

转载 作者:行者123 更新时间:2023-11-28 22:07:18 25 4
gpt4 key购买 nike

我刚刚开始尝试一种新技术,我将其命名为(至少目前)“模块鸭子类型(duck typing)”。

例子:

主模块

import somepackage.req  ## module required by all others
import abc
import Xyz

模块 abc

__all__=[]

def getBus():
""" Locates the `req` for this application """
for mod_name in sys.modules:
if mod_name.find("req") > 0:
return sys.modules[mod_name].__dict__["Bus"]
raise RuntimeError("cannot find `req` module")

Bus=getBus()

在模块 abc 中,我不需要显式地 import req:它可以在包层次结构中的任何位置。当然这需要一些纪律...

使用这种技术,可以很容易地在层次结构中重新定位包。

有陷阱在等着我吗?例如转向 Python 3K

更新:经过更多测试后,我决定返回直接在 sys.path 中插入包依赖项。

最佳答案

可能导入了各种包含“req”的模块,而您不知道它是否是您真正要查找的模块:

>>> import urllib.request
>>> import tst
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "tst.py", line 12, in <module>
Bus=getBus()
File "tst.py", line 9, in getBus
return sys.modules[mod_name].__dict__["Bus"]
KeyError: 'Bus'

包的全部意义在于模块层次结构有命名空间。如果用户碰巧导入了一些恰好包含名称冲突的模块的库,“从任何包”查找模块名称只会导致您的代码随机中断。

关于python - 模块 "duck typing"陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2322116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com