为什么这个try/except/else函数返回None?

2 投票
1 回答
5516 浏览
提问于 2025-04-18 02:17

我正在尝试创建一个文件夹。如果这个文件夹的名字已经存在,那么就会在文件夹名字后面加上“_1”,并且这个过程会一直重复下去。

如果文件夹不存在,这个操作是没问题的。如果文件夹已经存在,它会创建一个新的文件夹,名字是原来的文件夹加上“_1”,并且这个操作也能正常进行。但是,如果“文件夹_1”也已经存在,那么这个函数会创建“文件夹_1_1”,但返回的结果却是None。

import os

def recurs_mkdir(out_dir):
    try:
        os.mkdir(out_dir)
    except OSError:
        out_dir += "_1"
        recurs_mkdir(out_dir)
    else:
        print "Returning: %s" % out_dir
        return out_dir

>>> print recurs_mkdir("existing_folder")
Returning: existing_folder_1
None

为什么在出现异常的情况下会返回None呢?

编辑:Nneoneo的回答在“existing_folder”存在时是有效的,但如果“existing_folder”和“existing_folder_1”都存在时就不太正常了。修改后的函数是:

import os

def recurs_mkdir(out_dir):
    try:
        os.mkdir(out_dir)
    except OSError:
        out_dir += "_1"
        recurs_mkdir(out_dir)
        print "Returning: %s" % out_dir
        return out_dir
    else:
        print "Returning: %s" % out_dir
        return out_dir

如果“existing_folder”已经创建:

>>> recurs_mkdir("existing_folder")
Returning: existing_folder_1
Returning: existing_folder_1
existing_folder_1

如果“existing_folder”和“existing_folder_1”都已经存在:

>>> recurs_mkdir("existing_folder")
Returning: existing_folder_1_1
Returning: existing_folder_1_1
Returning: existing_folder_1
existing_folder_1

编辑2:Nneoneo的回答

import os

def recurs_mkdir(out_dir):
    try:
        os.mkdir(out_dir)
    except OSError:
        out_dir += "_1"
        return recurs_mkdir(out_dir)
    else:
        print "Returning: %s" % out_dir
        return out_dir

1 个回答

4

因为在出现异常的情况下,根本没有调用到 return 语句,所以这个函数会返回一个默认值 None(这就像你写了一个没有返回值的 return 语句时得到的结果一样)。

如果你想返回其他的值,可以在 except 语句块中添加一个 return 语句,返回你想要的内容。

撰写回答