Python中惰性数据流系统的元类[关闭]
Posted
技术标签:
【中文标题】Python中惰性数据流系统的元类[关闭]【英文标题】:Metaclasses for lazy dataflow system in Python [closed] 【发布时间】:2012-04-13 02:01:55 【问题描述】:我对延迟执行的数据流评估框架有一个想法。我想我需要元类,但我对它们还不太了解。也许您已经知道以下是否可行。
我想编写普通程序,并且仅仅通过从某个元类派生对象,我想引入惰性求值。因此
a=A()
b=B()
c=C(a,b)
d=D(a)
if input()=="c":
print(c.result)
else:
print(d.result)
我想要做的就是让这个惰性评估(即对于 input="c" 只有 A,B,C 将被执行,而对于 input="d" 只有 A,D 将被执行)是导出我的元类中的 A、B、C、D。
我正在考虑更改__new__
,以便它返回一个实际上不执行__init__
的代理对象。只有在属性访问时,它才会执行__init__
并转发所有属性访问。
此外,这个代理对象应该有一些类方法,可以在实际__init__
-ing真实对象之前提前检查init参数是否有效(数据源)。事实上,我想在不加载对象的情况下打印数据流依赖图。
最后,作为最后一点,我想在我的数据中引入依赖跟踪。所有对象方法都应该神奇地检查它们的参数并通过对所有输入参数的引用来丰富方法的返回结果(如果它是我可以设置属性的“普通类”)。这样我就可以随时跟踪在某些最终数据中发挥作用的因素。
您认为这是可能的吗,或者您可能已经知道它是如何工作的?特别是最后一部分我不确定。
【问题讨论】:
(a) 这是可能的 (b) 这个问题含糊而开放。没有人会为你设计你的系统。去阅读一些文献,然后带着一个至少有点具体的问题回来。 查看 Greenspuns 编程第十条规则:c2.com/cgi/wiki?GreenspunsTenthRuleOfProgramming @Gerenuk 或者实际上,这可能只是你的错,你懒得写一个合适的问题,这就是为什么唯一的答案也告诉你这个问题不够具体。 @Marcin:这是一个完整的规范。完整的规范是:“使上面的代码与 A、B、C、D 派生自元类的唯一修改一起工作。一切都应该延迟加载。所有方法结果都应该保留对它们每个来源的所有输入参数的引用。”如果这太难了,就不要解决这样的问题。 @Gerenuk 我从未提到过规范。但是,碰巧,这不是一个规范,它是一个模糊的简介。说真的,SO 上没有人会为你写这个。 【参考方案1】:您的系统可能基于__call__
属性。那么你的例子将相当于:
a=A()
b=B()
c=C(a,b)
d=D(a)
if input()=="c":
print(c())
else:
print(d())
用调用的行为表示评估。但你也可以只有一个方法 *lazy_evaluate()*。
您会发现更具体地说明您的系统会对您有所帮助。编写功能规范。您的问题不是功能规范。你考虑得不够充分。
【讨论】:
以上是关于Python中惰性数据流系统的元类[关闭]的主要内容,如果未能解决你的问题,请参考以下文章