當使用愛德華,我們總是用from edward.models import Normal
,但我沒有找到的Normal
在github愛德華的源代碼中Normal類的位置在哪裏?
任何聲明誰可以告訴我在哪兒呢
當使用愛德華,我們總是用from edward.models import Normal
,但我沒有找到的Normal
在github愛德華的源代碼中Normal類的位置在哪裏?
任何聲明誰可以告訴我在哪兒呢
它們在edward/models/random_variables.py
定義。
導入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):
pass