相关疑难解决方法(0)

使用python捕获异常时如何引发DeprecationWarning?

我写了一个有时会引发异常的库。有一个例外,我想弃用,我想建议人们停止捕捉它们,并在警告消息中提供建议。但是如何使异常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该如何修改以实现这一目标?

python exception deprecation-warning

5
推荐指数
2
解决办法
659
查看次数

防止为类或模块创建新属性

我看到这个问题关于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)

这可能吗?

python

3
推荐指数
1
解决办法
1180
查看次数

在运行时创建动态命名的函数

我正在创建一个名为的简单包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)

python python-2.7

1
推荐指数
1
解决办法
100
查看次数

使用模块__getattr__时如何回退到默认值

TL; DR:globals()[name]CORRECT 是否可以回归到"默认"?

我有一大堆动态创建的类,它们是从YML文件定义的.

动态类创建是通过PyYAMLyaml.safe_load_alldataclasses.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.

python attributes module python-3.7

1
推荐指数
1
解决办法
412
查看次数

从列表中访问字典

我有一些字典如下

d1={}  
d2={}  
d3={}  
Run Code Online (Sandbox Code Playgroud)

字典键的值包含列表
和列表,

l1=[d1,d2,d3]
Run Code Online (Sandbox Code Playgroud)

list包含所有可用字典的名称.我想遍历列表中包含所有字典名称的所有字典.

如何通过列表访问所有这些词典?

python

0
推荐指数
1
解决办法
175
查看次数