Should I hide imports of dependencies in a python module from the __dir__ method?(我应该隐藏从__dir__方法导入的依赖项吗?)
本文介绍了我应该隐藏从__dir__方法导入的依赖项吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用具有多个模块(一个文件夹、多个文件)的单个导入包制作一个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()找到它们的任何依赖项,但感觉有点不知所措,因为我不知道它们有哪些依赖项,也不知道如何找到它们的依赖项。
推荐答案
从Python3.7开始,您可以定义用于生成dir(module)结果的module-level __dir__ function:
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]
这篇关于我应该隐藏从__dir__方法导入的依赖项吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:我应该隐藏从__dir__方法导入的依赖项吗?
基础教程推荐
猜你喜欢
- 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
- Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
- 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
- 求两个直方图的卷积 2022-01-01
- 在Python中从Azure BLOB存储中读取文件 2022-01-01
- PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01
- 修改列表中的数据帧不起作用 2022-01-01
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
- 包装空间模型 2022-01-01
- 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
