Tôi đã gặp phải thông báo lỗi khá khó hiểu (với tôi ít nhất) khi cố sử dụng trình trang trí để cập nhật trình bao bọc của hàm. Bất kỳ ý tưởng làm thế nào tôi có thể khắc phục điều này?Lỗi gặp phải khi sử dụng trình trang trí để cập nhật trình bao bọc
Tôi đã cố gắng làm cho mã của mình càng chung càng tốt để nó cũng sẽ áp dụng cho các tình huống khác.
def decorator(d):
"""Make function d a decorator: d wraps a function fn."""
def _d(fn):
return functools.update_wrapper(d(fn), fn)
functools.update_wrapper(_d, d)
return _d
@decorator
def f(fn):
"""Converts the string fn to a function and returns it.
Because of the @decorator decorator, _f.__name__ should
be identical to f.__name__"""
f.__name__ = fn
def _f(fn):
return eval(fn)
return _f
g = f('x**2')
print g.__name__
đầu ra mong muốn:
>>>x**2
đầu ra thực tế:
Traceback (most recent call last):
File "C:\python\swampy-2.0\testcode.py", line 18, in <module>
g = f('x**2')
File "C:\python\swampy-2.0\testcode.py", line 6, in _d
return functools.update_wrapper(d(fn), fn)
File "C:\Python27\lib\functools.py", line 33, in update_wrapper
setattr(wrapper, attr, getattr(wrapped, attr))
AttributeError: 'str' object has no attribute '__module__'
Cảm ơn câu trả lời! Có, tôi biết rõ rằng eval nên được sử dụng hết sức thận trọng :) Trong trường hợp này, mặc dù, tôi nghĩ rằng tôi sẽ gắn bó với nó. Trong trường hợp cụ thể này, điều quan trọng là tôi cũng lưu trữ điểm đến trong _f .__ name___. Nó không có vẻ giống như bất kỳ giải pháp nào cung cấp cho yêu cầu đó. –
Ồ, bạn có thể đặt 'f .__ name__'. Hãy để tôi cập nhật câu trả lời của tôi. – stderr
Trong trường hợp này, những gì _f() đang thực sự làm không thực sự là mối quan tâm chính của tôi (tôi nên đã làm rõ điều đó trong câu hỏi của tôi). Tôi chủ yếu quan tâm đến việc cập nhật hàm wrapper bằng cách sử dụng một trình trang trí. –