Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“如何近似”;进口包装。*";用Python_Python_Python Import - Fatal编程技术网

“如何近似”;进口包装。*";用Python

“如何近似”;进口包装。*";用Python,python,python-import,Python,Python Import,我正在编写一个Python程序,可以解析由消息组成的二进制协议。每条消息都有一个标识符,后跟特定于类型的数据。我构建了我的应用程序,使每种消息类型都由一个(子)类表示,该类位于我的包中自己的模块中: messages/ __init__.py MessageTypeOne.py MessageTypeTwo.py ... 从我的主文件(在同一个包中,但我认为这无关紧要)中,我想做与 import package.* 也就是说,我希望加载所有模块类型,但不将其导入到本地

我正在编写一个Python程序,可以解析由消息组成的二进制协议。每条消息都有一个标识符,后跟特定于类型的数据。我构建了我的应用程序,使每种消息类型都由一个(子)类表示,该类位于我的包中自己的模块中:

messages/
   __init__.py
   MessageTypeOne.py
   MessageTypeTwo.py
   ...
从我的主文件(在同一个包中,但我认为这无关紧要)中,我想做与

import package.*
也就是说,我希望加载所有模块类型,但不将其导入到本地名称空间中(即,不是来自package import*的
)。我不想明确列出消息类型(只需添加一个文件就足够了),但可以使用类似于blaimport*
构造

我已经找到了一种方法来实现这一点,方法是在
os.listdir(\uuuu path\uuuu)
importlib.import\u module()。。。有没有更优雅的方法

更新:
根据使用情况(例如,对日志记录或发送单个消息进行解码),我并不总是希望导入每种消息类型,因此在
\uuuu init\uuuuuuuuuuuuuuuuuuuuuupy
中静态导入它们是不可取的

我可能需要
\uuuuu init\uuuuuuuuuuuuuuuuuuuuuupy
进行导入:

# in __init__.py
from . import MessageTypeOne
from . import MessageTypeTwo
...
如果您不想这样做,您可以使用
\uuuu import\uuu

__import__('package', fromlist=['*'])

这将执行与包导入*
中的
相同的初始化,但不实际绑定本地命名空间中的任何名称。注意,它不会初始化包导入中
不会初始化的任何子模块*
,因此您仍然需要配置
\uuuuuuuuuuuuuuuuuuuuuuupy
中的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuucode>列表,以便执行导入:

# in __init__.py
from . import MessageTypeOne
from . import MessageTypeTwo
...
如果您不想这样做,您可以使用
\uuuu import\uuu

__import__('package', fromlist=['*'])

这将执行与包导入*
中的
相同的初始化,但不实际绑定本地命名空间中的任何名称。请注意,它不会初始化从包导入*
不会初始化的任何子模块,因此您仍然需要在
\uuuuu init\uuuuuuuuupy

中配置
\uuuuuuu all\uuuuuuuu
列表,但我可以从包内动态填充
\uuuuuuuuuuuuuuuuuu
?还是说
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>必须是一个静态列表?我花了一段时间才弄清楚相对导入的语法。这里供将来参考:
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?还是说
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>必须是一个静态列表?我花了一段时间才弄清楚相对导入的语法。此处供将来参考:
\uuuuu导入(subpackage,globals=globals(),level=1,fromlist=['*'))
我建议将所有消息类型放在一个模块中,然后导入该模块(为什么要使用多个模块,每个模块只包含一个类?)。否则,只需将它们导入
\uuu init\uuuuuuuuupy
从.MessageTypeX导入…
),然后您可以再次导入消息
,消息类型的范围将通过
消息。SomeMessageType
。只需将所有类放在同一个模块中。将它们全部放在一个模块中从技术上讲是可行的,但我更喜欢20个文件,每个文件100行,而不是一个2000行的文件。我建议将所有消息类型放在一个模块中,然后导入该模块(为什么要使用多个模块,每个模块只包含一个类?)。否则,只需将它们导入
\uuu init\uuuuuuuuupy
从.MessageTypeX导入…
),然后您可以再次导入消息
,消息类型的范围将通过
消息。SomeMessageType
。只需将所有类放在同一个模块中。将它们全部放在一个模块中从技术上讲是可行的,但我更喜欢20个文件,每个文件100行,而不是一个2000行的文件。