我是否应该从_dir__方法隐藏python模块中依赖项的导入?

2024-05-17 19:04:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个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")

在交互模式下使用

>>> 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()找到它们的依赖项,但感觉有点不知所措,因为我不知道它们有哪些依赖项,也不知道如何找到它们的依赖项


Tags: 模块the用户inimportworld选项dir
1条回答
网友
1楼 · 发布于 2024-05-17 19:04:32

从Python 3.7开始,您可以定义一个module-level ^{} function,用于生成dir(module)的结果:

def __dir__():
    return ['joke']

这可以与处理from module import *导入的__all__结合使用:

__all__ = ['joke']

def __dir__():
    return __all__

请注意,用户仍然可以访问这些依赖项包,即joke.markdown仍然有效。如果您确实想限制这一点,还可以定义模块级别__getattr__

def __getattr__(name):
    if name not in __all__:
        raise AttributeError(name)
    return globals()[name]

相关问题 更多 >