Python 使用块手动实现会产生不同的结果
假设我写信Python 使用块手动实现会产生不同的结果,python,tensorflow,contextmanager,Python,Tensorflow,Contextmanager,假设我写信 with some_method() ... 我的印象是,with命令首先调用\uuuuu enter\uuuuu()方法,处理some\u方法()返回的任何内容。(我相信somemethod()返回的东西被称为“上下文管理器”,也就是说它有名为\uuuuuuuuuuuuuu()和\uuuuuuuuuuu()的方法) 我试着手动调用\uuuuu enter\uuuu(),结果得到了与预期不同的结果。这个具体的例子是在TensorFlow的上下文中出现的,但我很确定它与Ten
with some_method()
...
我的印象是,with
命令首先调用\uuuuu enter\uuuuu()
方法,处理some\u方法()返回的任何内容。(我相信somemethod()
返回的东西被称为“上下文管理器”,也就是说它有名为\uuuuuuuuuuuuuu()
和\uuuuuuuuuuu()
的方法)
我试着手动调用\uuuuu enter\uuuu()
,结果得到了与预期不同的结果。这个具体的例子是在TensorFlow的上下文中出现的,但我很确定它与TensorFlow本身没有任何关系
import tensorflow as tf
x = tf.Session()
x.as_default().__enter__()
print(tf.get_default_session())
打印None
,以及
import tensorflow as tf
tf.Session().as_default().__enter__()
print(tf.get_default_session())
打印无
,但
import tensorflow as tf
with tf.Session().as_default():
print(tf.get_default_session())
打印
我已经发布了基本相同的问题,但我犯了错误,编辑了太多次,直到最后它没有问它开始问什么。因此,我只是重新创建这个问题。这可能是因为您放弃了上下文管理器。很少有上下文管理器被设计为在\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
之后丢弃,而不调用\uuuuuuuuuuuuuuuuuuuuuuuu。当垃圾被收集时,它们中的一些会自动调用等价的\uuuuu exit\uuuu
,而另一些则会以奇怪的方式进行操作
在这种特殊情况下,我相信tf.Session().as_default()
最终会委托给一个代理。垃圾回收时,底层生成器会自动调用其close
方法,这与调用上下文管理器的\uuuuuuuuuuuuu
方法非常相似。这听起来可能与上下文管理器被回收有关。with
语句保留了对上下文管理器的引用(或者至少是对其\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法的引用,该方法通常具有对上下文管理器的引用),但您将放弃它。尝试将x.as_default()
保存到变量中。是的,许多上下文管理器都有一个close
方法(或等效的私有对象),该方法在\uu del\uuuuuuuu
以及\uuuuu exit\uuuu>中调用。(这对于文件和许多其他上下文管理器来说是有意义的,有些人这样做,尽管仅仅通过与文件等进行类比是没有意义的。)你是对的,将x.保存为默认值()
到一个变量修复了它。一般来说,“垃圾收集”什么时候发生在对象上?只是想更好地理解这里发生了什么。@EricAuld:在CPython中,通常是在清除对对象的最后一次引用时。一般来说,一个对象在一段时间后不再可到达,或者可能永远无法到达。