2009-11-27 47 views
0

我想这是有点滥用的功能,但我仍然好奇它是否能够做到 - 我想做的事情是这样的:该print 1部分仅当==执行我该如何有条件地在“with”块中执行代码?

with conditional(a): 
    print 1 

所以真正。 这可能吗?

编辑: 像下面的人一样,这是可怕的风格。这只是一个谜语\问题。不要尝试这种在家里,不适合心脏等

+4

我想你最终会看到别人无法读懂的代码!“如果”可能是最标准的编程结构之一,每个人都知道它为什么重新发明轮子? – jkp 2009-11-27 13:17:28

+2

为什么人们玩高尔夫球(http://en.wikipedia.org/wiki/Perl_golf#Perl_golf) - 有时你只是想看看它是否可以完成:) – olamundo 2009-11-27 13:23:45

+0

-1:请不要这样做。请。 – 2009-11-27 14:29:09

回答

8

有没有真正的理由这样做,因为条件语句使用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 决定将其保留为是。

+2

-1:'if a == True'。请只说'如果'。 – 2009-11-27 14:28:31

+4

@ S.Lott:没有理由会降低答案,因为它完全符合问题的要求。这是一个问题,“只有当'==真'”。 – 2009-11-27 14:59:35

+0

-1:S.Lott是完全正确的,这是可怕的风格。 – nikow 2009-11-27 15:17:28

4
if a is True: 
    print 1 

with statement微弱的目的是提供一个可靠的进入退出上下文。

+1

我问你是否可以让汽车跑上可口可乐,而你回答“你应该使用燃料”:) 就像我说的,我知道这是功能滥用,但认为它是一个编程谜题 - 是否有可能? – olamundo 2009-11-27 13:19:16

2

我看到的唯一方法是在conditional中引发一个异常,如果它的参数是错误的。 with正文不会被执行,但是后面的任何代码都不会被执行 - 当然,直到exceptfinally子句为止。

0

比方说,我有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块中。但我不建议这样做。

+0

这并不为已到达为'A'任何1以外的值工作 文件 “”,1号线,在 与B(A(2)): AttributeError:'NoneType'对象没有属性'__exit__' 这是因为'b'中的'pass'没有返回有效的上下文管理器。 – abyx 2009-11-27 14:20:58

+0

当然,如果条件不成立,它会抛出一个AttributeError :) – ikkebr 2009-11-27 16:18:29

+0

如果参数没有'b'属性,那么你就说失败了,但即使这样做,如果'c.b!= 1'也会失败, – abyx 2009-11-27 18:00:05