首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在edward的源代码中Normal类的位置在哪里?

在edward的源代码中Normal类的位置在哪里?
EN

Stack Overflow用户
提问于 2017-02-10 11:32:34
回答 1查看 92关注 0票数 1

在使用edward时,我们总是使用from edward.models import Normal,但我没有在github中找到Normal的声明

有谁能告诉我它在哪里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-21 16:54:56

它们是在edward/models/random_variables.py中定义的。

您可以按如下方式导入Normal类:

代码语言:javascript
复制
from edward.models import Normal

这建议在edward/models/__init__.py中查找,其中包含以下代码:

代码语言:javascript
复制
from edward.models.random_variables import *

edward/models/random_variables.py中我们找到了this code

代码语言:javascript
复制
from edward.models.random_variable import RandomVariable as _RandomVariable
from tensorflow.contrib import distributions as _distributions

# Automatically generate random variable classes from classes in
# tf.contrib.distributions.
_globals = globals()
for _name in sorted(dir(_distributions)):
  _candidate = getattr(_distributions, _name)
  if (_inspect.isclass(_candidate) and
          _candidate != _distributions.Distribution and
          issubclass(_candidate, _distributions.Distribution)):

    # to use _candidate's docstring, must write a new __init__ method
    def __init__(self, *args, **kwargs):
      _RandomVariable.__init__(self, *args, **kwargs)
    __init__.__doc__ = _candidate.__init__.__doc__
    _params = {'__doc__': _candidate.__doc__,
               '__init__': __init__}
    _globals[_name] = type(_name, (_RandomVariable, _candidate), _params)

del _candidate

这将遍历tensorflow.contrib.distributions模块,查找从tensorflow.contrib.distributions.Distribution派生的类(忽略其他属性,如模块的__file__成员或Distribution基类本身)。对于每一个,它都会进行一些黑客攻击(这只会影响生成的文档),然后执行以下关键代码行:

代码语言:javascript
复制
_globals[_name] = type(_name, (_RandomVariable, _candidate), _params)

type()内置函数创建一个新类型,即声明一个新类。第二个参数是基类列表,这里是edward的RandomVariable类和TensorFlow随机变量类。早些时候,它将_globals定义为globals(),这是一个返回模块变量字典的内置函数。因此,在您感兴趣的情况下,上面的代码行相当于以下代码:

代码语言:javascript
复制
from edward.models.random_variable import RandomVariable as EdRandVar
from tensorflow.contrib.distributions import Normal as TfNormal
Normal = type("Normal", (EdRandVar, TfNormal), {...})

这反过来等同于此(如果忽略文档字符串内容):

代码语言:javascript
复制
from edward.models.random_variable import RandomVariable as EdRandVar
from tensorflow.contrib.distributions import Normal as TfNormal
class Normal(EdRandVar, TfNormal):
    pass
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42151044

复制
相关文章

相似问题

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