如何枚举package中的modules

shaver 2010-10-20 09:12:32
某package中有文件如下:
somepackage:
__init__.py
a.py
b.py
c.py

__init__.py的内容:

import a, b, c
__all__ = [a, b, c]

现在的问题是,__all__的内容是固定的。如何用代码动态生成__all__的内容?
比如,我想在该package中增加d.py,如何不用修改__init__.py的内容,d自动出现在__all__中?
...全文
119 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
劲草 2010-12-12
  • 打赏
  • 举报
回复
向各位学习了
zanpen2000 2010-11-15
  • 打赏
  • 举报
回复
一般我都是建立一个lib目录,然后建立一个文本文件 : __init__.py,内容为空,之后 from lib import module_name,如果需要动态加载,楼上几位的方法都行的。3楼的做法是可行的,也更灵活,我也在用。
iambic 2010-10-29
  • 打赏
  • 举报
回复
应用级别的问题,找到解决方案就行了。语言级别上,常见的都不支持这种用法。
shaver 2010-10-29
  • 打赏
  • 举报
回复
之所以有这个问题,是我想实现这样的功能:

某个系统,需要技术服务人员或用户可以定制规则。规则的通用部分,我已经放在父类里面实现了。子类统一放在某个目录下,系统启动时读取该目录下的各子类文件,加载各规则。
除了枚举该目录下文件的方法外,我想知道python有没有直接的支持,可以把该目录看做一个package。当增加一个新的规则文件时,直接把文件放置在该目录下即可,而不需要修改__init__.py文件。

继续讨论中......
angel_su 2010-10-21
  • 打赏
  • 举报
回复
模块的__all__有特殊用途,可控制from package import * 这种写法倒入那些名称,所以还是显式制定比较合理,譬如a,b是public, c是a或b内部自己用,那么__init__.py的内容可以写成:

__all__ = ['a', 'b']
from package import *
iambic 2010-10-21
  • 打赏
  • 举报
回复
这个不是python的惯用法,建议你不要这样用了。非要用的话也可以,比如可以这样:

import os

__all__ = [f[:-3] for f in os.listdir(os.path.dirname(__file__)) if f.endswith(".py")]
__all__.remove('__init__')

for m in __all__:
__import__(__name__ + '.' + m)


notax 2010-10-20
  • 打赏
  • 举报
回复
噢,又打错了


somepackage.__all__= [ a, b, c, d]
notax 2010-10-20
  • 打赏
  • 举报
回复
动太加一加就行
比如在e.py中


import somepackage
from somepackage import a, b, c, d

print somepackage.__all__
mypkg.__all__ = [ a, b, c, d]
print somepackage.__all__


#PYTHONPATH里要加somepackage 路径

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧