我尝试使用PythonDecoratorLibrary中的属性定义(示例3)。 => https://wiki.python.org/moin/PythonDecoratorLibrary#Property_Definition
import sys
def property(function):
keys = 'fget', 'fset', 'fdel'
[...]
另外导入sys后我收到此错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in Angle
File "<stdin>", line 12, in property
TypeError: property() got an unexpected keyword argument 'doc'
第12行是:function()因为sys导入:)
我的python版本在Windows上为3.4.1。
答案 0 :(得分:2)
首先:这是一种丑陋的方式,允许本地函数定义3个属性函数。
示例装饰器屏蔽property
内置,但后来尝试使用它来生成property
对象。糟糕。
您仍然可以通过以下方式访问内置的原始组件:
import builtins
def property(function):
keys = 'fget', 'fset', 'fdel'
func_locals = {'doc':function.__doc__}
def probe_func(frame, event, arg):
if event == 'return':
locals = frame.f_locals
func_locals.update(dict((k, locals.get(k)) for k in keys))
sys.settrace(None)
return probe_func
sys.settrace(probe_func)
function()
return builtins.property(**func_locals)
即使本地名称已覆盖内核,builtins
module也允许您访问内置版。
我已更新维基页面以反映这一点。
答案 1 :(得分:1)
该示例依赖于内置的property
函数,同时也命名为property
:
def property(function):
keys = 'fget', 'fset', 'fdel'
func_locals = {'doc':function.__doc__}
def probe_func(frame, event, arg):
if event == 'return':
locals = frame.f_locals
func_locals.update(dict((k, locals.get(k)) for k in keys))
sys.settrace(None)
return probe_func
sys.settrace(probe_func)
function()
return property(**func_locals) # This is supposed to be the built-in property
因此它最终调用自身(不会使用doc
关键字参数),而不是内置property
(它采用doc
关键字参数)。所以是的,这个例子被打破了。它调用property
的函数应该被命名为其他函数,或者它应该保存对内置property
的引用并在内部调用它。
修改:使用builtins.property
显然比在屏蔽它之前保存对property
的引用要好得多。所以请继续。