首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当用户导入不推荐的变量时引发自定义ImportError

当用户导入不推荐的变量时引发自定义ImportError
EN

Stack Overflow用户
提问于 2018-08-20 13:50:53
回答 2查看 91关注 0票数 2

我已经编写了一个包,其中一个子模块包含了我想要删除的模块级变量deprecated_var,因为这是一个可怕的错误。

代码语言:javascript
运行
复制
mypkg
  - mymodule
    - __init__.py

但是,我不想只让我的最终用户拥有一个通用的ImportError,我想打印一条消息,说明他们的导入是不推荐的,以及他们应该做什么。因此,与其:

代码语言:javascript
运行
复制
>>> from mypkg.mymodule import deprecated_var
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name 'deprecated_var'

我希望用户看到这样的东西:

代码语言:javascript
运行
复制
>>> from mypkg.mymodule import deprecated_var
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: mypkg.mymodule.deprecated_var was removed. Replace 
  with "from foo.bar import Baz; deprecated_var = Baz()"

我怎样才能做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-20 14:24:38

在python3.7之前,我认为这是不可能的。

但是,在python3.7或更高版本中,这可以通过使用在__getattr__中添加的模块级PEP562来实现。

你会这样用:

代码语言:javascript
运行
复制
#_deprecated_vars is a dict of keys -> alternatives (or None)
_deprecated_vars: Dict[str, Optional[str]] = {
        'deprecated_var': 'from foo.bar import Baz; deprecated_var = Baz()', 
        'other_deprecated_var': None
    }

def __getattr__(name):
    if name in _deprecated_vars:
        alt_text = '{name} was removed from module {__name__}'
        replace_text = _deprecated_vars[name]
        if replace_text is not None:
           alt_text += f'. Replace with {replace_text!r}.'
        raise AttributeError(alt_text)
    raise AttributeError(f"module {__name__} has no attribute {name}")

但是,我不确定这是否适用于from a.b import deprecated_var的用例。这是关于import a.b; a.b.deprecated_var的更多内容。见前者的另一个答案。

票数 2
EN

Stack Overflow用户

发布于 2018-08-20 14:29:16

对于特定的示例,可以使用以下方法:

mymodule/__init__.py

代码语言:javascript
运行
复制
#deprecated_var = 5
replacement_var = 6

mymodule/deprecated_var.py

代码语言:javascript
运行
复制
raise ImportError("deprecated_var is deprecated. Use mypkg.mymodule.replacement_var instead")

当直接导入变量时,这会引发自定义ImportError

代码语言:javascript
运行
复制
>>> from mymodule import deprecated_var
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../mymodule/deprecated_var.py", line 1, in <module>
    raise ImportError("deprecated_var is deprecated. Use mypkg.mymodule.replacement_var instead")
ImportError: deprecated_var is deprecated. Use mypkg.mymodule.replacement_var instead

当作为模块属性访问它时,它什么也不做。或者更确切地说,它抛出一个AttributeError而不是一个弃用警告:

代码语言:javascript
运行
复制
>>> import mymodule
>>> mymodule.deprecated_var
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'mymodule' has no attribute 'deprecated_var'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51932222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档