我写了一个有时会引发异常的库。有一个例外,我想弃用,我想建议人们停止捕捉它们,并在警告消息中提供建议。但是如何使异常DeprecationWarning在捕获时发出?
import warnings
class MyException(ValueError):
...
warnings.warn(
"MyException is deprecated and will soon be replaced by `ValueError`.",
DeprecationWarning,
stacklevel=2,
)
...
def something():
raise MyException()
Run Code Online (Sandbox Code Playgroud)
try:
mylib.something()
except MyException: # <-- raise a DeprecationWarning here
pass
Run Code Online (Sandbox Code Playgroud)
我MyException该如何修改以实现这一目标?
我看到这个问题关于SO Prevent在init之外创建新属性,它展示了如何防止向类的对象添加新属性。
我希望整个类甚至整个加载的模块具有相同的行为。
示例类:
class Klass:
a = 0
b = 1
Run Code Online (Sandbox Code Playgroud)
另一个模块:
from Klass import Klass
Klass.c = 2 # this should raise an error
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我正在创建一个名为的简单包pyma,可在pypi上找到.
我提供了一种计算N日指数移动平均值的方法,该函数称为NDayEMA(n, data).(事实上,它是一个名为的类NDayEMA,带有一个被调用的函数,compute()但它在这里是无关紧要的.)
我试图在运行时创建一个动态命名的函数作为用户的快捷方式.
例如:
NDayEMA(30, data)
Run Code Online (Sandbox Code Playgroud)
和
EMA30(data)
Run Code Online (Sandbox Code Playgroud)
会是一样的
EMA23(data)
EMA1023(data)
EMA12(data)
Run Code Online (Sandbox Code Playgroud)
也可以.
我知道我需要一些注册和处理,这在你的答案中是不需要的; 我自己会得到它!我正在搜索如何接收用户提供的函数的名称,并创建具有该名称的函数,而不会引发错误消息.
这是来自Laravel PHP框架的PHP等价物.
$user = DB::table('users')->where_email_and_password('example@gmail.com', 'secret');
Run Code Online (Sandbox Code Playgroud) TL; DR:globals()[name]CORRECT 是否可以回归到"默认"?
我有一大堆动态创建的类,它们是从YML文件定义的.
动态类创建是通过PyYAMLyaml.safe_load_all和dataclasses.make_dataclass(3.7中的新增功能)的组合完成的.我希望这些类的规范偶尔会随着时间而改变,这就是为什么我选择YML作为一种易于理解的格式来描述它们.
Python 3.7引入了新功能(参见PEP 562):__getattr__用于管理模块属性访问的模块级__dir__功能(还有一个模块级功能).利用这个新函数可以方便地dataclass从模块名称空间导入每个动态创建的类,如下所示:
# some_module.py
from package_name import DataClassName1, DataClassName2
Run Code Online (Sandbox Code Playgroud)
......并且像这样:
# package_name/__init__
from .my_dataclasses import DynamicDataClassesDict
def __getattr__(name):
try:
return DynamicDataClassesDict[name]
except KeyError:
# fall back on default module attribute lookup
Run Code Online (Sandbox Code Playgroud)
在阅读PEP 562时,我不清楚如何回退到模块属性访问的默认功能.对于一个班级,人们只会打电话super().__getattr__(*args).我确实在其中一个例子中看到了这一行:
return globals()[f"_deprecated_{name}"]
Run Code Online (Sandbox Code Playgroud)
这种方法似乎有效.是globals()[name]回落到"默认"的正确方法?它似乎并不是,因为它globals()[name]会提高KeyError而不是预期AttributeError.
我有一些字典如下
d1={}
d2={}
d3={}
Run Code Online (Sandbox Code Playgroud)
字典键的值包含列表
和列表,
l1=[d1,d2,d3]
Run Code Online (Sandbox Code Playgroud)
list包含所有可用字典的名称.我想遍历列表中包含所有字典名称的所有字典.
如何通过列表访问所有这些词典?