python中的if语句小窍门

If statement in python, shorthand

我有语法错误,但我不知道为什么…

问题是:

1
os.makedirs(nombre) if not existeCarpeta(nombre) else print ("Directorio existente")

我在打印中有一个指针,这是完整的函数:

1
2
3
4
5
6
7
8
def existeArchivo(nom):
   return os.path.isfile(nom)

def existeCarpeta(nombre):
   return os.path.isdir(nombre)

def creaCarpeta(nombre):
    os.makedirs(nombre) if not existeCarpeta(nombre) else print ("Directorio existente")


这个怎么样?

1
print ("Directorio existente") if existeCarpeta(nombre) else os.makedirs(nombre)

如果目录不存在,它将打印None,但它确实会为您创建目录。

您也可以这样做以避免"无"被打印,但这非常尴尬:

1
s = ("Directorio existente") if existeCarpeta(nombre) else os.makedirs(nombre); print s if s else ''

如果您使用的是python 2,而没有使用它,那么这只是一个语法错误。

1
from __future__ import print_function

因为不能将print语句用作条件表达式的一部分。

1
2
3
4
5
6
7
8
9
10
11
Python 2.7.10 (default, Oct  6 2017, 22:29:07)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type"help","copyright","credits" or"license" for more information.
>>>"foo" if False else print("error")
  File"<stdin>", line 1
   "foo" if False else print("error")
                            ^
SyntaxError: invalid syntax
>>> from __future__ import print_function
>>>"foo" if False else print("error")
error

但是,您的代码容易受到竞争条件的影响。如果其他进程在检查目录之后但在尝试创建目录之前创建了该目录,则带有的代码将引发错误。只需尝试创建目录,并捕获因此发生的任何异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Python 2
import errno
try:
    os.makedirs(nombre)
except OSError as exc:
    if exc.errno != errno.EEXISTS:
        raise
    print ("Directorio existente")

# Python 3
try:
    os.makedirs(nombre)
except FileExistsError:
    print ("Directorio existente")