我应该从__dir__方法中隐藏python模块中的依赖项导入吗?

问题描述 投票:1回答:1

我正在用一个具有多个模块(一个文件夹,多个文件)的单个导入包制作一个Python分发包。该软件包具有依赖关系,这些依赖关系已导入模块中。当用户从导入包中导入模块时,他们还可以访问从函数外部导入的依赖项。我找到了解决方法,但是不确定是否是个好主意。

模块joke.py的选项A

from markdown import markdown

def joke():
    return markdown("The Funniest Joke in the World")

模块joke.py的选项B

def joke():
    from markdown import markdown
    return markdown("The Funniest Joke in the World")

在交互模式下使用A

>>> import joke
>>> joke.joke()
'The Funniest Joke in the World'
>>> dir(joke)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'joke', 'markdown']
>>> joke.markdown("Not funny")
'<p>Not funny</p>'

B在交互模式下的使用

>>> import joke
>>> dir(joke)
['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__file__', '__cached__', '__builtins__', 'joke', 'markdown']
>>> joke.markdown("Not funny")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'joke' has no attribute 'markdown' 

问题

我不想向用户公开依赖项,这意味着选项B更好。但是,如果所有导入都需要在类或函数内部,则代码将变得混乱。在不使导入变得混乱的情况下,是否有更好的选择来实现B中的功能?

我查看了一些软件包,以查看是否可以使用dir()找到它们的任何依赖关系,但由于不知道它们具有哪些依赖关系或如何找到它们的依赖关系而感到有点不知所措。

python python-3.x python-import python-module
1个回答
1
投票
dir(module)

可以与处理def __dir__(): return ['joke'] 进口的__all__结合使用:

from module import *

请注意,用户仍然可以访问这些依赖包,即__all__ = ['joke'] def __dir__(): return __all__ 仍然有效。如果确实要限制此设置,则还可以定义模块级别的joke.markdown

__getattr__
© www.soinside.com 2019 - 2024. All rights reserved.