Python 关于“kur.engine.engine.\u evaluate”如何工作的困惑

Python 关于“kur.engine.engine.\u evaluate”如何工作的困惑,python,Python,问题 在kur.engine.engine.的使用上似乎存在冲突 当我在kur/example/directory下运行kur dump mnist.yml并查看运行细节时,我得到: 但是,当我运行eng=kur.engine.engine,然后运行eng._evaluate'mnist-defaults.yml'时,我得到了以下错误: 源代码是怎么说的 我对该功能文档的阅读: 1.将字符串作为参数命名表达式 2.返回python对象或类 我对该代码的解读: 1.我给这个函数一个字符串arg 2

问题

在kur.engine.engine.的使用上似乎存在冲突

当我在kur/example/directory下运行kur dump mnist.yml并查看运行细节时,我得到:

但是,当我运行eng=kur.engine.engine,然后运行eng._evaluate'mnist-defaults.yml'时,我得到了以下错误:

源代码是怎么说的

我对该功能文档的阅读: 1.将字符串作为参数命名表达式 2.返回python对象或类

我对该代码的解读: 1.我给这个函数一个字符串arg 2.它返回一个名为“未实现错误”的错误

def _evaluate(self, expression):
    """ Evaluates a string expression in the current scope.

        # Arguments

        expression: str. The string to evaluate.

        # Return value

        The evaluated expression (some Python object/class)
    """
    # pdb.set_trace()
    raise NotImplementedError
然而,事实上,当在控制台kur dump mnist.yml中运行时,它就像文档所说的那样工作。那么,我的理解哪里出了问题?谢谢

发动机是一个重要的部件。这意味着它不打算直接实例化。相反,它的派生类将基类用作扩展其功能的模板。这是一个经典的模式,尤其是在java和C++语言中。不过Python是一种非常灵活的语言,有很多方法可以实现类似的设计模式,例如模块、duck类型或经典继承加上良好的文档和未实现的错误


在您的特定情况下,当您实际运行Kur时,引擎的实例化运行时类型不是engine;这是金贾发动机。因此,当发出_evaluate调用时,实际上是JinjaEngine在处理它,而不是基类,正如您正确指出的那样,引发异常。尝试实例化一个JinjaEngine,您应该会得到预期的结果。

基于上面的@ajsyp注释:

您肯定是在实例化引擎,这是一个抽象基类,不应该这样做。当Kur实际运行时,或者如果您想要获得预期的行为,那么请实例化一个JinjaEngine。抽象基类是一种说法,这就是这种类型的对象在不实际创建其中一个对象的情况下的行为方式;相反,派生类负责实现基类的行为。这是一种标准的OOP模式

如果我理解正确,在运行kur-vv build mnist.yml和使用logger显示kur.Kurfile.parse_source下的函数时,我注意到以下几点:

[INFO 2017-04-11 14:05:05,946 kur.kurfile parse:97] (self): after initialize Kurfile object, we parse it: 1. evaluate all section dicts in spec.data with scopes; 2. as a result, spec.data added section aliases (like training, testing);3. other uses here to be answered ....; 4. assign spec.data['templates'] to spec.templates; 3. convert spec.data['model'] into model as containers, and store the list of containers inside spec.contaienrs ; 5. return Nothing
[INFO 2017-04-11 14:05:05,946 kur.kurfile _parse_section:1006]
[DEBUG 2017-04-11 14:05:05,946 kur.kurfile _parse_section:1011] _parse_section(): Parsing Kurfile section: settings
[INFO 2017-04-11 14:05:05,947 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,947 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,947 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,947 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,947 kur.kurfile _parse_section:1006]
[DEBUG 2017-04-11 14:05:05,947 kur.kurfile _parse_section:1011] _parse_section(): Parsing Kurfile section: train
[INFO 2017-04-11 14:05:05,947 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,948 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,948 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,948 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,948 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,948 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,948 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,948 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,948 kur.engine.jinja_engine _evaluate:123] (self, expression): convert a yml expression (a string) to a python object
[INFO 2017-04-11 14:05:05,949 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,949 kur.engine.jinja_engine _evaluate:123] (self, expression): convert a yml expression (a string) to a python object
[INFO 2017-04-11 14:05:05,950 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,950 kur.engine.jinja_engine _evaluate:123] (self, expression): convert a yml expression (a string) to a python object
[INFO 2017-04-11 14:05:05,951 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,951 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,951 kur.engine.jinja_engine _evaluate:123] (self, expression): convert a yml expression (a string) to a python object
[INFO 2017-04-11 14:05:05,951 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,952 kur.engine.jinja_engine _evaluate:123] (self, expression): convert a yml expression (a string) to a python object
[INFO 2017-04-11 14:05:05,952 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
[INFO 2017-04-11 14:05:05,952 kur.engine.jinja_engine _evaluate:123] (self, expression): convert a yml expression (a string) to a python object
[INFO 2017-04-11 14:05:05,953 kur.engine.engine evaluate:209] (self, expression, recursive=False): Evaluates an string expression in the current scope, as itself: (how does scope help evaluate expression? Not sure how is scope used); if expression is not a string, then do some recursion.
当代码在kur.Kurfile.parse上运行时,它会在设置、训练、验证等不同部分进行解析。。。 在执行kur.Kurfile.\u parse_部分时,大多数部分需要运行大量的kur.engine.engine.engine.evaluate,如果不是没有,也需要运行少量的kur.engine.jinjiaEngine.JinjaEngine.\u evaluate 我是否应该以以下方式理解评论和意见:

kur.engine.engine.evaluate,kur.engine.engine.engine.\u evaluate是基类方法,实际上我不需要了解它们的内部;是这样吗? kur.engine.jinja_engine.jinja_engine._Evaluation是从上述基本方法中派生出来的方法,我需要了解它的实际意义;是这样吗? 我对kur.engine.jinja_engine.JinjaEngine.的理解:它是将yaml字符串表达式转换为python对象。对吗? 如果没有,你能举例说明吗?不必是工作代码,只是一个我们可以在脑海中描绘的例子也可以

谢谢

@ajsyp进一步的回答和解释非常有用

一,。根据定义,引擎类中定义的所有函数都是基类方法。这并不意味着它们不重要。它们非常重要!具体来说,Engine.evaluate确实有效,它试图找出如何处理数据、数据的类型、是否需要递归等等。Engine.\u evaluate定义派生类必须实现的API,尽管从纯代码的角度来看,Engine.\u evaluate不做任何事情,因为它的工作是定义API,所有实现都委托给派生类。 2.是的,JinjaEngine.\u evaluate是一个派生类方法。在这种特殊情况下,它实现了由父类的API定义的逻辑。 3.有点JinjaEngine.\u evaluate负责使用Kurfile的当前值来计算Jinja2表达式,而不是YAML表达式;YAML解析器已经做到了这一点;事实上,您可以使用一个JSON文件,而这个完整的答案仍然是正确的。Jinja2表达式的计算结果是Python表达式的字符串表示。因此,如果需要,函数还需要解释该字符串,以构造底层Python类型,例如整数4与字符串4


我能用上面的例子实际地理解下面的内容吗?1.当从控制台运行时,它是kur.engine.engine.\u evaluate在引擎盖下工作,返回mnist.yml,即使在源代码中它只有一行代码raise NotImplementedError,但不理解为什么如此2。从ipython跑过来的时候,我
我们必须使用kur.engine.JinjaEngine.\u评估以获得结果mnist.yml.某种程度上,是的。您肯定是在实例化引擎,这是一个抽象基类,不应该这样做。当Kur实际运行时,或者如果您想要获得预期的行为,那么请实例化一个JinjaEngine。抽象基类是一种说法,这就是这种类型的对象在不实际创建其中一个对象的情况下的行为方式;相反,派生类负责实现基类的行为。这是一种标准的OOP模式。