gpt4 book ai didi

python - 用 Python 装饰整个库

转载 作者:行者123 更新时间:2023-11-28 19:46:14 24 4
gpt4 key购买 nike

我对装饰器的想法还很陌生(并且仍在努力研究它们),但我认为我遇到了一个非常适合它们的问题。我想要在数学库中的所有函数中装饰的类。更具体地说,我的类(class)有两个成员,xflag。当 flag 为真时,我希望调用原始数学函数。当 flag 为 false 时,我想返回 None

作为我在这里要问的框架是类:

import math

class num(object):
def __init__(self, x, flag):
self.x = x
self.flag = flag

def __float__(self):
return float(self.x)

因此,这工作正常:

a = num(3, True)
print math.sqrt(a)

但是这应该(在我的完美世界中)返回None:

b = num(4, False)
print math.sqrt(b)

关于如何将其应用于整个函数库,有什么建议或提示吗?

最佳答案

这是总体思路...:

>>> class num(object):
... def __init__(self, x, flag):
... self.x = x
... self.flag = flag
... def __float__(self):
... return float(self.x)
... from functools import wraps
>>> def wrapper(f):
... @wraps(f)
... def wrapped(*a):
... if not all(getattr(x, 'flag', True) for x in a):
... return None
... return f(*(getattr(x, 'x', x) for x in a))
... return wrapped
...
>>> import inspect
>>> import math
>>> for n, v in inspect.getmembers(math, inspect.isroutine):
... setattr(math, n, wrapper(v))
...

>>> a = num(3, True)
>>> print math.sqrt(a)
1.73205080757
>>> b = num(4, False)
>>> print math.sqrt(b)
None

请注意,此包装器还涵盖了 math 中的非一元函数(返回 None 如果 any 参数有 False .flag )并允许混合调用(一些参数是 num 的实例,其他是实际的 float )。

适用于任何“将所有功能包装在某个模块中”任务的关键部分是使用模块 inspect获取模块 math 中函数(内置或非内置)的所有名称和值, 以及对包装器的显式调用(与装饰器语法相同的语义)将该名称设置为 math 中的包装值模块。

关于python - 用 Python 装饰整个库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3191799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com