自我记录的Python代码

时间:2014-05-15 13:59:20

标签: python python-3.x

我有以下Python:

class CollectorGUI(Gtk.Window):
    def __init__(self, prefill, flags, data_to_return):
        """prefill should be an instance of the Prefill class"""
        self.prefill = prefill
        self.flags = flags
        self.data_to_return = data_to_return
    ......

我的问题是:(1)如何摆脱文档字符串?我希望我的代码能够自我记录; (2)如何摆脱这三条线:

self.prefill = prefill
self.flags = flags
self.data_to_return = data_to_return

是否有缩写?

2 个答案:

答案 0 :(得分:4)

可以使用function annotations

在方法签名中记录Prefill要求
class CollectorGUI(Gtk.Window):
    def __init__(self, prefill: Prefill, flags, data_to_return):

注释在运行时是可发现的,就像文档字符串一样。注释不是强制执行的(它们是不同用例的更通用的垫脚石),但在签名中立即显而易见。

然后,您可以选择asserting the type明确强制执行它:

assert isinstance(prefill, Prefill), 'prefill must be an instance of Prefill'

至于从函数参数中自动设置属性,这在其他地方得到了解答:What is the best way to do automatic attribute assignment in Python, and is it a good idea?

答案 1 :(得分:0)

虽然您可以使用inspect来自动地从方法签名中的参数创建属性,但它会混淆您现在拥有的完全可读的代码。 看一下构造函数告诉我该类至少具有prefill,flags和data_to_return属性。

隐式显式代码通常不是一个好主意。

但如果你坚持:

import inspect


class C(object):

  def __init__(self, a, b, c):
      spec = inspect.getargspec(getattr(C, "__init__"))
      for arg in spec.args[1:]:
        setattr(self, arg, locals()[arg])



c = C(1, 2, 3)

print c.a
print c.b
print c.c