首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于`kur.engine.Engine._evaluate`如何工作的困惑

关于`kur.engine.Engine._evaluate`如何工作的困惑
EN

Stack Overflow用户
提问于 2017-03-27 03:20:11
回答 2查看 48关注 0票数 0

问题

在使用kur.engine.Engine._evaluate方面似乎存在冲突。

当我在kur dump mnist.yml目录下运行kur/example/并查看运行详细信息时,我得到了:

然而,当我运行eng = kur.engine.Engine()eng._evaluate('mnist-defaults.yml')时,我得到了以下错误:

源代码说什么?

我读取这个函数doc: 1.将字符串作为arg命名的表达式2.返回python对象或类

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

代码语言:javascript
复制
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中运行时,它的工作方式就像文档所说的那样。那么,我的理解哪里出错了?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-28 16:34:13

Engine抽象基类。这意味着它是,而不是打算直接实例化的。相反,它的派生类使用基类作为扩展其功能的“模板”(可以这么说)。这是面向对象程序设计中的一个典型模式,特别是在Java和C++等语言中。Python是一种非常灵活的语言,有许多方法可以实现类似的设计模式(例如,abc模块、鸭子类型或经典继承加上良好的文档和NotImplementedError)。

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

票数 1
EN

Stack Overflow用户

发布于 2017-04-11 06:23:24

基于上面的@ajsyp评论:

您肯定是在实例化引擎,这是一个抽象基类,不应该这样做。当Kur实际运行时,或者如果您想得到预期的行为,那么实例化一个JinjaEngine。抽象基类是一种表示“这是这种类型的对象的行为方式”的方式,而不是实际创建一个对象;相反,派生类负责实现基类的行为。这是一个标准的OOP模式

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

代码语言:javascript
复制
[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.
  1. 当代码在kur.Kurfile.parse上运行时,它在settingstrainvalidate等不同的部分进行解析。
  2. 在执行kur.Kurfile._parse_section时,大多数部分都需要运行大量的kur.engine.engine.Engine.evaluate,如果不是,只需要运行几个kur.engine.jinjiaEngine.JinjaEngine._evaluate

我是否应以下列方式理解该评论和意见:

  1. kur.engine.engine.Engine.evaluatekur.engine.engine.Engine._evaluate是基类方法,实际上我不需要理解它们的内部,对吗?
  2. kur.engine.jinja_engine.JinjaEngine._evaluate是从上述基本方法导出的方法,我需要理解它的实际意义,对吗?
  3. 我对kur.engine.jinja_engine.JinjaEngine._evaluate的理解是:将yaml字符串表达式转换为python对象。这是正确的吗?

如果没有,你能举个例子解释一下吗?(不必是工作代码,只是一个我们可以在脑海中想象的例子也可以)

谢谢

@ajsyp更多的答案和解释非常有用

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43037422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档