是否有可能在具有多个条件的单个if / else语句中找到哪个条件失败?

时间:2013-12-19 19:04:08

标签: python

很快我需要验证是否验证了3个条件,如果没有执行有关失败条件的事情。我知道我可以使用多个if / else语句迭代3个条件,但我想知道是否有更简单,更简洁的方法。

以更通用的方式:

   if condition1 and condition2 and condition3: pass
   else: print which condition has failed

对于应用案例:

if file_exist("1.txt") and file_exist("2.txt") and file_exist("3.txt"):
         pass
else: 
         #find which condition has failed
         #for file of the failed condition
               create_file(...)

我不打算解决上面的例子!我的问题是如何找到在单个if / else语句中的一系列条件中未验证哪个条件!

此致

4 个答案:

答案 0 :(得分:5)

I know I can iterate through the 3 files with multiple if/else statements

每当你在编程问题中发现这样的重复时,这是一个很好的迹象,你可以使用一个循环:

for filename in ("1.txt", "2.txt", "3.txt"):
    if not file_exist(filename):
        create_file(...)

你也可以使用列表理解:

[create_file( filename ) for filename in ("1.txt", "2.txt", "3.txt") if not file_exist(filename)]

这更接近你用英语阅读它的方式,但是有些人会对它不屑一顾,因为你使用列表理解来引起副作用,而不是实际创建列表

答案 1 :(得分:2)

不,这是不可能的。 if语句只有一个条件,在这种情况下条件为condition1 and condition2 and condition3。它不会“记住”该表达式中子表达式的结果,所以除非它们有副作用,否则你运气不好。

另请注意,如果condition1为false,则根本不会评估condition2。因此,如果您想知道哪些条件(复数)失败,那么and将完全是错误的工具。你可以改为做:

results = (condition1, condition2, condition3)
if all(results):
    pass
else:
    # look at the individual values

但实际上,如果你在查看单个值时要为每个错误值“做某事”,那么你不需要特殊情况下它们都是真的。只需执行相同的代码,每一步都不执行任何操作。

我想,为了证明一点,你可以做一些特别的事情来记录第一次失败:

def countem(result):
    if result:
        countem.count += 1
    return result
countem.count = 0

if countem(condition1) and countem(condition2) and countem(condition3):
    pass
else:
    print countem.count

或者摆脱if更简洁一点:

conditions = (lambda: condition1, lambda: condition2, lambda: condition3)
first_failed = sum(1 for _ in itertools.takewhile(lambda f: f(), conditions))

当然这对你的例子来说不是明智的代码,但就它而言,它处理的是一般情况。

答案 2 :(得分:1)

而不仅仅使用if / else解决方案:

for file_name in('1.txt', '2.txt', '3.txt'):
    try:
       with open(file_name): # default mode 'r' to read file
           #do something... or not
    except IOError:
       with open(file_name, 'w') as f:
           #something to do...

#modes can be 'w', 'a', 'w+', 'a+' for writing, appending,write/read, append/read respectively. There are others...

还有:

import os.path

file_path = '/this path if all files/ have the same path.../'

for file_name in('1.txt', '2.txt', '3.txt'):
    if os.path.exists(file_path/file_name):
        continue
    else:
        #create the file


# though os.path.exists this will return True for directories also

答案 3 :(得分:0)

我只是说它看起来像一个for循环来满足某些条件。

尝试输入打印语句,看看是否满足每个条件......简单但有效。