我想这有点滥用这个功能,但我仍然很好奇是否可以这样做 - 我想做点什么:

with conditional(a):
    print 1

这样只有在== True时才会执行 print 1 部分。 这可能吗?

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

有帮助吗?

解决方案

没有真正的理由这样做,因为条件已经使用 if 语句提供:

if a == True:
    print 1

但是,如果你只是要求有趣,答案是你不能。要停止执行内容的 conditional 将需要以某种方式停止执行,在其 __ enter __ 方法中。但它唯一能做到这一点的方法就是引发一个异常,这意味着没有其他代码会运行,除非用 try 语句用包装来处理案例 a!= True

编辑:看到我在评论和投票中被起诉使用OP的条件( a == True )我考虑将其更改为如果,这当然是Python中用于测试条件的习语。但是,我们不知道 OP的想法是什么,以及他是否确实希望 a 成为布尔值,并且如果 a = [1] (如果将传递)我决定保留原样。

其他提示

if a is True:
    print 1

with statement 旨在提供可靠的进入退出环境。

我看到的唯一方法是在 conditional 中引发异常,如果它的参数为false。 with body将不会执行,但后面的任何代码都不会执行 - 当然,除 finally 子句之外的

假设我有一个带有__enter__和__exit__函数的A类:

class A:
    def __init__(self, i):
        self.b = i
    def __exit__(*args, **kwargs):
        print "exit"
    def __enter__(*args, **kwargs):
        print "enter"

一个函数B将检查对象c中的b是否等于1,否则它将通过。

def b(c):
    if c.b == 1:
        return c
    else:
        pass

我可以实现:

with b(A(1)):
    print 10


enter
10
exit

但是如果b传递,它将抛出一个AttributeError,因为带的将无法使用。 解决方案是将与b(A(1)):放在try / except块中。但我不建议这样做。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top