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

本教程将介绍我应该隐藏从__dir__方法导入的依赖项吗?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

我应该隐藏从__dir__方法导入的依赖项吗? 教程 第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()找到它们的任何依赖项,但感觉有点不知所措,因为我不知道它们有哪些依赖项,也不知道怎么找到它们的依赖项。

推荐答案

从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__方法导入的依赖项吗?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。