在使用edward时,我们总是使用from edward.models import Normal,但我没有在github中找到Normal的声明
有谁能告诉我它在哪里
发布于 2017-09-21 16:54:56
它们是在edward/models/random_variables.py中定义的。
您可以按如下方式导入Normal类:
from edward.models import Normal这建议在edward/models/__init__.py中查找,其中包含以下代码:
from edward.models.random_variables import *在edward/models/random_variables.py中我们找到了this code
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基类本身)。对于每一个,它都会进行一些黑客攻击(这只会影响生成的文档),然后执行以下关键代码行:
_globals[_name] = type(_name, (_RandomVariable, _candidate), _params)type()内置函数创建一个新类型,即声明一个新类。第二个参数是基类列表,这里是edward的RandomVariable类和TensorFlow随机变量类。早些时候,它将_globals定义为globals(),这是一个返回模块变量字典的内置函数。因此,在您感兴趣的情况下,上面的代码行相当于以下代码:
from edward.models.random_variable import RandomVariable as EdRandVar
from tensorflow.contrib.distributions import Normal as TfNormal
Normal = type("Normal", (EdRandVar, TfNormal), {...})这反过来等同于此(如果忽略文档字符串内容):
from edward.models.random_variable import RandomVariable as EdRandVar
from tensorflow.contrib.distributions import Normal as TfNormal
class Normal(EdRandVar, TfNormal):
passhttps://stackoverflow.com/questions/42151044
复制相似问题