gpt4 book ai didi

python - 在装饰器中使用 self 是不好的做法吗?

转载 作者:太空狗 更新时间:2023-10-30 00:52:17 25 4
gpt4 key购买 nike

虽然我知道您不能在装饰器中直接引用 self,但我想知道从 args[0]< 中提取它是否是一种不好的做法。我的直觉是,但我想确定。

更具体地说,我正在开发网络服务的 API。大约一半的命令需要传递一个 token ,稍后可以使用该 token 来撤消它。我想要的是使该标记成为一个可选参数,如果没有提供,则生成一个。生成 token 需要对服务器进行经过身份验证的调用,服务器需要来自对象的数据。

虽然我知道我可以做到:

def some_command(self, ..., undo_token = None):
if undo_token = None:
undo_token = self.get_undo_token()
...
return fnord

我觉得可能有比在十几个方法中使用相同代码更好的方法。我的想法是写一个装饰器:

@decorator
def undoable(fn, *args, **kwargs):
if 'undo_token' not in kwargs:
kwargs['undo_token'] = args[0].get_undo_token()
return (fn(*args, **kwargs), kwargs['undo_token'])

所以我可以写得更干净

@undoable
def some_command(self, ...):
...
return foo

@undoable
def some_other_command(self, ...):
...
return bar

我是否让自己陷入困境?

最佳答案

我不明白你在为 undoable 编码什么——装饰器通常不是这样编码的,我不知道 @decorator 会从哪里来来自(是否有 from youforgottotelluswhence import decorator 或更邪恶的东西?看看为什么我不能忍受使用 from 来构建“人工裸名”而不是使用 nice 装饰 名字?-).

使用正常的装饰器编码,例如......:

import functools

def undoable(f):
@functools.wraps(f)
def wrapper(self, *a, **k):
tok = k.get('undo_token')
if tok is None:
tok = k['undo_token'] = self.get_undo_token()
return f(self, *a, **k), tok
return wrapper

命名包装器的第一个强制位置参数 self 绝对没有问题,使用它比使用可读性较差的 args[0] 更清晰。

关于python - 在装饰器中使用 self 是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3631768/

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