我有一个名为foo的包.它的组织如下:
package_dir/foo/foo.py
package_dir/foo/utils.py
package_dir/foo/other.py
package_dir/foo/__init__.py
Run Code Online (Sandbox Code Playgroud)
我可能应该将foo.py命名为其他东西,但是这个库随着时间的推移而发展和演变,现在支持其他东西并且现在全部使用.该软件包被捆绑并存储在我们内部的pipy服务器上,因此在安装时,我最终得到/usr/lib/python2.7/site-packages/foo.
从这个包中导入的最佳方法是什么?
目前我这样做:
import foo
Run Code Online (Sandbox Code Playgroud)
然后我最终在客户端代码中执行此操作:
foo.foo.myfunction()
Run Code Online (Sandbox Code Playgroud)
有许多类和函数可用于使用此方法:
from foo import blah, blah, blah
Run Code Online (Sandbox Code Playgroud)
这有点笨拙.这是包装的pythonic方法吗?有一个更好的方法吗?
感谢任何帮助.
*更新*
所以我已经完成了这个,但它没有找到我的功能:
from __init__.py:
import foo
import utils
import other
Run Code Online (Sandbox Code Playgroud)
然后我像这样导入:
import foo
Run Code Online (Sandbox Code Playgroud)
然后在我的代码中我尝试过:
foo.myfunc()
Run Code Online (Sandbox Code Playgroud)
并且:
myfunc()
Run Code Online (Sandbox Code Playgroud)
两人抱怨:
AttributeError: 'module' object has no attribute 'myfunc'
Run Code Online (Sandbox Code Playgroud)
你有一些选择:
from foo import foo
foo.myfunction()
Run Code Online (Sandbox Code Playgroud)
要么
from foo import foo as something
something.myfunction()
Run Code Online (Sandbox Code Playgroud)
要么
import foo.foo as something
something.myfunction()
Run Code Online (Sandbox Code Playgroud)
或者您可以"推广"某些API,以便它们从顶级发布.导入它们foo/__init__.py然后您可以从包对象中使用它们.例如,您的新手foo/__init__.py可能是:
from .foo import myfunction
Run Code Online (Sandbox Code Playgroud)
请注意显式相对导入语法,以避免顶级foo包和嵌套foo包之间存在歧义.
然后你可以写:
import foo
foo.myfunction()
Run Code Online (Sandbox Code Playgroud)
等等.
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |