PythonDecoratorLibrary中是否有错误 - 属性定义3?

时间:2014-07-04 15:59:49

标签: python python-3.x properties

我尝试使用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。

2 个答案:

答案 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的引用要好得多。所以请继续。