我想这是有点滥用的功能,但我仍然好奇它是否能够做到 - 我想做的事情是这样的:该print 1
部分仅当==执行我该如何有条件地在“with”块中执行代码?
with conditional(a):
print 1
所以真正。 这可能吗?
编辑: 像下面的人一样,这是可怕的风格。这只是一个谜语\问题。不要尝试这种在家里,不适合心脏等
我想这是有点滥用的功能,但我仍然好奇它是否能够做到 - 我想做的事情是这样的:该print 1
部分仅当==执行我该如何有条件地在“with”块中执行代码?
with conditional(a):
print 1
所以真正。 这可能吗?
编辑: 像下面的人一样,这是可怕的风格。这只是一个谜语\问题。不要尝试这种在家里,不适合心脏等
有没有真正的理由这样做,因为条件语句使用if
声明已经提供:
if a == True:
print 1
但是,如果你只是在寻求乐趣,答案是你不能真的。要停止with
内容的执行,conditional
需要以某种方式停止执行,其方法为__enter__
。但它可以做到这一点的唯一方法是抛出一个异常,这意味着没有其他的代码将运行,除非你有try
声明包裹with
办案a != True
编辑:眼看我在评论起诉,投票使用OP的条件(a == True
)我认为将其改为if a
,这当然是Python中用于测试条件语言的成语。但是,我们不知道 OP在想什么,以及他是否确实希望a
是一个布尔值,并且不希望块如果执行a = [1]
(它将通过if a
)I 决定将其保留为是。
-1:'if a == True'。请只说'如果'。 – 2009-11-27 14:28:31
@ S.Lott:没有理由会降低答案,因为它完全符合问题的要求。这是一个问题,“只有当'==真'”。 – 2009-11-27 14:59:35
-1:S.Lott是完全正确的,这是可怕的风格。 – nikow 2009-11-27 15:17:28
if a is True:
print 1
with
statement微弱的目的是提供一个可靠的进入退出上下文。
我问你是否可以让汽车跑上可口可乐,而你回答“你应该使用燃料”:) 就像我说的,我知道这是功能滥用,但认为它是一个编程谜题 - 是否有可能? – olamundo 2009-11-27 13:19:16
我看到的唯一方法是在conditional
中引发一个异常,如果它的参数是错误的。 with
正文不会被执行,但是后面的任何代码都不会被执行 - 当然,直到except
或finally
子句为止。
比方说,我有A类与__enter__和__exit__功能:
class A:
def __init__(self, i):
self.b = i
def __exit__(*args, **kwargs):
print "exit"
def __enter__(*args, **kwargs):
print "enter"
而且功能B,将检查是否b在对象C等于1,否则它会通过。
def b(c):
if c.b == 1:
return c
else:
pass
我能做到:
with b(A(1)):
print 10
enter
10
exit
但是,如果B通过作为与不会有什么一起工作会抛出一个AttributeError。 解决方法是将with b(A(1)):
放入try/except块中。但我不建议这样做。
我想你最终会看到别人无法读懂的代码!“如果”可能是最标准的编程结构之一,每个人都知道它为什么重新发明轮子? – jkp 2009-11-27 13:17:28
为什么人们玩高尔夫球(http://en.wikipedia.org/wiki/Perl_golf#Perl_golf) - 有时你只是想看看它是否可以完成:) – olamundo 2009-11-27 13:23:45
-1:请不要这样做。请。 – 2009-11-27 14:29:09