gpt4 book ai didi

python - 我的装饰师有多糟糕?

转载 作者:太空狗 更新时间:2023-10-30 01:55:59 26 4
gpt4 key购买 nike

我最近创建了一个 @sequenceable 装饰器,它可以应用于任何接受一个参数的函数,并使其自动适用于任何序列。这是代码(Python 2.5):

def sequenceable(func):
def newfunc(arg):
if hasattr(arg, '__iter__'):
if isinstance(arg, dict):
return dict((k, func(v)) for k, v in arg.iteritems())
else:
return map(func, arg)
else:
return func(arg)
return newfunc

正在使用中:

@sequenceable
def unixtime(dt):
return int(dt.strftime('%s'))

>>> unixtime(datetime.now())
1291318284
>>> unixtime([datetime.now(), datetime(2010, 12, 3)])
[1291318291, 1291352400]
>>> unixtime({'start': datetime.now(), 'end': datetime(2010, 12, 3)})
{'start': 1291318301, 'end': 1291352400}

我的问题是:

  • 这是个糟糕的想法吗?为什么?
  • 这可能是个好主意,但在实现时存在重大缺陷吗?
  • 潜在的陷阱是什么使用此代码?
  • 是否有内置函数或库已经在做我正在做的事了吗?

最佳答案

是个糟糕的主意。这本质上是宽松的打字。鸭子打字就到此为止东西应该拿走,IMO。

考虑一下:

def pluralize(f):
def on_seq(seq):
return [f(x) for x in seq]
def on_dict(d):
return dict((k, f(v)) for k, v in d.iteritems())
f.on_dict = on_dict
f.on_seq = on_seq
return f

你的例子就变成了

@pluralize
def unixtime(dt):
return int(dt.strftime('%s'))


unixtime.on_seq([datetime.now(), datetime(2010, 12, 3)])
unixtime.on_dict({'start': datetime.now(), 'end': datetime(2010, 12, 3)})

这样做仍然需要调用者知道(在 duck-typing 精度范围内)传入的内容,并且不会向实际函数添加任何类型检查开销。它还适用于任何类似 dict 的对象,而您的原始解决方案取决于它是 dict 的实际子类。

关于python - 我的装饰师有多糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4339099/

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