【发布时间】:2015-02-14 15:41:58
【问题描述】:
我想确保该类仅在“with”语句中实例化。
即这个没问题:
with X() as x:
...
这不是:
x = X()
我怎样才能确保这样的功能?
【问题讨论】:
-
天哪你会想要这样做吗?
x = X()、with x as result_of_entering:(创建 CM 并在两个单独的行上使用它)是一个有效的用例!如果我想将 CM 存储在映射中以动态选择一个,或者使用contextlib.ExitStack(),该怎么办?合并多个 CM?在许多用例中,CM 在您将阻止的with语句之外创建。不要以让那些知道自己在做什么的人更难为代价来尝试修复所有可能的错误。 -
这正是我想弄清楚的问题,而且——老实说,@MartijnPieters——虽然我知道你对你的回答充满热情,但我不能我的生活到底是什么,你是如此坚定,我做而不是。
-
@LaurentStanevich 你想阻止
x = X()工作吗?你能告诉我为什么你认为这是必要的吗? Python 不认为对象的分配是需要被阻止或特殊的。x = X()和with X() as x:中的X()调用表达式在 Python 中被完全相同地处理,两者都将结果放入堆栈,以便下一条指令(赋值或 with 语句块设置)可以使用该对象。阻止分配在这里没有意义,并且会积极破坏重要的用例。 -
@LaurentStanevich:不管怎样,这再次强调了 OP 和你都没有告诉我们为什么你认为你需要这个。这具有XY problem 的所有特征,试图解决更大的问题。如果你退后一步,回到你认为这个问题背后的想法可以解决问题的原始问题,那么我可能会提供帮助。
-
@LaurentStanevich:对于我能想到的任何情况,对于这个问题所代表的 Y 来说,这将是一个合理的 X,正确的答案是由Antti Haapala 编写:通过实现从
__enter__返回的不同对象类型,因此在以下三行x = X()/# do stuff with target中分配给target的东西。那么x = X()是“无害的”,因为它与target的对象类型不同。
标签: python with-statement