2016-08-20 42 views
1

Python版本:2.7。操作系统:Windows 10 64位。python try/except/else递归

注意:我找到了一个解决下面描述的问题的方法,它不使用try/except/else语句。我在问下面的问题只是因为我很好奇为什么代码的行为方式,以及是否有办法做我尝试使用try/except/else的方法。

我有一个叫blah.py文件,用下面的代码:

import os 

def makeFolder(dirName, num = 0): 
    try: 
     os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists 
    except: 
     makeFolder(dirName, num = num + 1) 
    else: 
     return dirName + '_' + str(num) 

现在我去PowerShell中,然后键入:

import blah 
myStr = blah.makeFolder('myFolder') 
print myStr 
print type(myStr) 

它做什么,我希望 - 一个名为myFolder_0文件夹被创建,并且它打印myFolder_0<type 'str'>。现在,仍然在PowerShell中,I型:

myStr1 = blah.makeFolder('myFolder') 
print myStr1 
print type(myStr1) 

这一次,它使一个被称为myFolder_1文件夹,如我所料,但不是打印myFolder_1<type 'str'>,它打印None<type 'NoneType'>。在接下来的每一次我使用blah.makeFolder('myFolder')时,它都会继续这样做。

如果我将在Powershell中输入的命令放入脚本中,行为也会有些奇怪。我做了一个叫blah2.py文件,该文件是一样的blah.py,但在最后一个脚本:

import os 

def makeFolder(dirName, num = 0): 
    try: 
     os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists 
    except: 
     makeFolder(dirName, num = num + 1) 
    else: 
     return dirName + '_' + str(num) 

myStr = makeFolder('myFolder') 
print myStr 
print type(myStr) 

myStr1 = makeFolder('myFolder') 
print myStr1 
print type(myStr1) 

然后在PowerShell中:

python blah2.py 

这一次,它使得myFolder_0并打印myFolder_0<type 'str'> ,(因此myStr块的工作原理与blah.py一样),然后进入无限递归(因此myStr1块不起作用)。所以出于我不明白的原因,这种行为与交互式会话中的行为不同。如果我再次键入python blah2.py,它使myFolder_1并打印None<type 'NoneType'>myStr块),然后进入无限递归再次(myStr1块)。

为什么脚本行为不同于互动环节中,为什么无限递归的脚本发生,是有我的代码版本仍然使用try /除/人,但工作?

import os 

def makeFolder(dirName, num = 0): 
    try: 
     os.mkdir(dirName + '_' + str(num)) 
    except OSError: 
     return makeFolder(dirName, num = num + 1) 
    else: 
     return dirName + '_' + str(num) 

print(makeFolder('myFolder')) # myFolder_0 
print(makeFolder('myFolder')) # myFolder_1 

至于为什么你看到的,你看到的......肯定有别的东西怎么回事:如果我添加一个return的递归调用

+0

欢迎的StackOverflow!我只想赞扬你提出一个很好的问题,包括一个很好的小例子。做得好! –

+1

“Powershell”与这里有什么关系?你是否打错了“Python shell”或者你是否真的在使用PowerShell? – smarx

+1

'blah2.py'对我来说看起来不正确......它执行'blah.makeFolder',但'blah'没有在任何地方定义? – smarx

回答

3

您的代码工作正常,我。您共享的代码blah2.py不可能工作,因为blah没有在任何地方定义。我的猜测是,你正在运行不同的代码而没有意识到它。 (也许在另一个目录中的文件的不同副本?)

+0

打我吧:),他也应该处理适当的异常,这将是'OSError',而不是除了陷阱,每个可能的异常除外 – danidee

+0

伟大的,这个作品,谢谢! 关于blah2的东西,有两件事:首先,在原来的文章中有一个错字,我的blah2.py文件没有blah.makeFolder,只是makeFolder。我会暂时编辑。其次,我重新启动计算机并重新运行它,然后它开始做与交互式会话相同的事情,所以我猜想内存中有些奇怪。 – user3558855

0

我的第一个想法是,你看到的不一致的行为可能是因为如果你一个接一个地运行它们,一些目录已经存在。为了防止这种情况,你可以添加以下代码,开始清理由以前的运行创建的任何目录:

import os 

for dirname in [f for f in os.listdir('.') if 
       (os.path.isdir(f) and f.startswith('myFolder'))]: 
    os.rmdir(dirname) 

但这里是如何解决实际的问题:

import os 

def makeFolder(dirName, num = 0): 
    try: 
     os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists 
    except: 
     return makeFolder(dirName, num = num + 1) 
    else: 
     return dirName + '_' + str(num)