Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当用户导入不推荐的变量时引发自定义ImportError

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

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

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

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

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

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

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

代码语言:javascript
运行
AI代码解释
复制
>>> 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 06:24:38

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

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

你会这样用:

代码语言:javascript
运行
AI代码解释
复制
#_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 06:29:16

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

mymodule/__init__.py

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

mymodule/deprecated_var.py

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

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

代码语言:javascript
运行
AI代码解释
复制
>>> 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
运行
AI代码解释
复制
>>> 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

复制
相关文章
Python导入自定义模块ImportError: No module named 'xxx'问题
Python导入自定义模块ImportError: No module named 'xxx'问题
芥末鱿鱼
2022/05/05
2.1K0
[1207]ImportError:无法导入名称“ RandomizedLogisticRegression”
ImportError:无法导入名称“ RandomizedLogisticRegression”
周小董
2023/10/10
4690
[1207]ImportError:无法导入名称“ RandomizedLogisticRegression”
ImportError:无法导入名称“ RandomizedLogisticRegression”
周小董
2023/10/10
4660
当HashMap的键遇见自定义类型时
这是Java中经典的问题,在面试中也经常被问起.很多书提到要重载hashCode()和equals()两个方法才能实现自定义键在HashMap中的查找,但是为什么要这样以及如果不这样做会产生什么后果,好像很少有文章讲到,所以来这一篇记录下.
JavaEdge
2022/11/29
4170
Mastercam 当车削导入实体时,如何快速对齐轴向?
数控编程、车铣复合、普车加工、Mastercam、行业前沿、机械视频,生产工艺、加工中心、模具、数控等前沿资讯在这里等你哦
lrglu
2023/10/24
4020
Mastercam 当车削导入实体时,如何快速对齐轴向?
(21)Bash用户自定义变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
生信real
2020/08/26
6830
不按标准引发的bug
我们曾经在初级和中级培训中给大家详细讲解了Modbus通讯的开发,并多次强调了一定要按照标准协议的要求编写Modbus驱动程序,可是现实中仍然有很多工程师不按照标准,导致通讯中会出现bug,最近也有猿友微我说他的Modbus通信中有bug。经过详细沟通,知道他在帧完成检测和帧间字节检测时候没有严格按照标准。 小猿曾经在嵌入式培训中多次强调告诫大家Modbus通讯中帧完成检测,也就是我们常说的t3.5个字节的帧中断完成检测,和t1.5的字节间检测。在标准协议中明确要求,我们在来温习一下,希望大家牢记这段,因
用户1605515
2018/04/11
7270
不按标准引发的bug
学艺不精引发的血案
今天有个线上小bug,是由zookeeper初始化引起的,把查找修复过程记录一下,其实和zookeeper没多大关系,还是并发的事情,不感兴趣的兄弟们可以撤了,O(∩_∩)O
Coder的技术之路
2021/05/14
2380
学艺不精引发的血案
创建与导入用户自定义OpcUa信息模型
理想中,每个行业都应该有自己行业的标准模型,比如:塑料行业有euromap标准,包装行业有packml标准。
剑指工控
2021/11/09
2K0
Python 错误类型
Python 程序中最常见的错误原因是某个语句不符合规定的用法。这种错误称为语法错误。Python 解释器会立即报告它,通常会附上原因。
很酷的站长
2023/08/15
2590
Python 错误类型
Jmeter系列(24)- 详解用户自定义变量
用户自定义变量 我们通过实际栗子去讲述理论知识点 测试计划树结构 测试计划 设置了一个变量 d1 线程组 模拟两个用户,各循环五次 线程组下的用户自定义变量 只设置了一个变量 d1 HTTP 请求下的
小菠萝测试笔记
2020/06/23
1.1K0
Jmeter系列(24)- 详解用户自定义变量
当使用 jquery 插件操作 input 时同步 vue 中绑定的变量办法
为什么要同步到 vue 上绑定的变量呢,因为如果我们不更新绑定的变量的值,vue 下次刷新组件的时候,就会将旧的值更新到 input 上。
前Thoughtworks-杨焱
2022/02/19
1.8K0
【切片】基础不扎实引发的问题
本次文章主要是来聊聊关于切片传值需要注意的问题,如果不小心,则很容易引发线上问题,如果不够理解,可能会出现奇奇怪怪的现象
阿兵云原生
2023/10/05
1540
【切片】基础不扎实引发的问题
Flask开发 导入flask_uploads包时提示“IMPORTERROR: CANNOT IMPORT NAME ‘SECURE_FILENAME‘ FROM ‘WERKZEUG‘“
从上述的报错信息,分析是是没有找到对应的模块。于是,进入到flask_uploads.py文件查看一下
叶庭云
2021/12/07
1.3K0
Flask开发 导入flask_uploads包时提示“IMPORTERROR: CANNOT IMPORT NAME ‘SECURE_FILENAME‘ FROM ‘WERKZEUG‘“
用户自己引发的异常处理
# 由用户自行定义的异常类处理 # 代码 # encoding = UTF-8 # 用户自己引发异常 class ShortInputException(Exception): '''一个由用户定义的异常类''' def __init__(self, length, atleast): Exception.__init__(self) self.length = length self.atleast = atleast try:
benym
2022/07/14
4300
当一个模块被导入两次时,会发生什么?
然后在另一个模块 consumer 中,将上述模块 increment 导入两次:
疯狂的技术宅
2020/03/27
8120
Jmeter接口测试之用户自定义变量(九)
在使用Jmeter做接口自动化测试中,经常会使用到公共的数据,那么就需要对这些公共的数据分离出来,不管是基于测试框架的思想,还是使用工具来进行做自动化测试,公共数据的分离首先是需要思考的。这里就以获取电话号码归属地来作为测试的案例,看接口的文档如下:
无涯WuYa
2018/10/25
1.9K0
Jmeter接口测试之用户自定义变量(九)
点击加载更多

相似问题

pyplot导入引发ImportError

15

导入pygame会引发ImportError

13

ImportError:当尝试导入自定义文件- Django时

112

ImportError引发试图导入函数

27

当试图导入ImportError中的自定义模块时

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档