【问题标题】:self-documenting Python code [closed]自记录 Python 代码 [关闭]
【发布时间】:2014-05-15 13:59:20
【问题描述】:

我有以下 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

有缩写吗?

【问题讨论】:

标签: python python-3.x


【解决方案1】:

Prefill 要求可以使用function annotations 记录在方法签名中:

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?

【讨论】:

    【解决方案2】:

    虽然您可以使用 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
    

    【讨论】:

    • 是的,这行得通。谢谢你。但正如 Martijn Peters 所建议的,似乎还有一种更简单的方法。
    猜你喜欢
    • 2010-09-08
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2011-04-22
    • 2015-02-14
    • 2010-09-17
    相关资源
    最近更新 更多