Python 除非
我对python相当陌生,当我注意到一些有趣的东西时,我就开始玩弄代码 文件atomicPast.rb版本1:Python 除非,python,exception,Python,Exception,我对python相当陌生,当我注意到一些有趣的东西时,我就开始玩弄代码 文件atomicPast.rb版本1: import datetime datatime.now() 我希望从python提示符(而不是Windows提示符)运行此代码。我就是这样做的: >>import sys >>sys.path.append("C:\\Users\\Myname\\Desktop\\Python") >>import atomicPast 我把时间打印出
import datetime
datatime.now()
我希望从python提示符(而不是Windows提示符)运行此代码。我就是这样做的:
>>import sys
>>sys.path.append("C:\\Users\\Myname\\Desktop\\Python")
>>import atomicPast
我把时间打印出来。但是,再次执行import atomicPast将无法工作,因为它已导入。所以我发现:
>>del sys.modules['atomicPast']
对我来说,这是一个不重要的问题,它的行为与之类似,因为后续的导入atomicPast将为我赢得时间(只要它再次不重要)。然而,我希望能够执行importatomicpass,而不必担心它是否已经不受影响。我决定在代码的末尾添加不重要的部分作为清理
文件atomicPast.rb版本2:
import sys, inspect, os
print datetime.datetime.now()
del sys.modules[ inspect.getfile(inspect.currentframe())[0:-3] ] #1
在#1中,我获取不带扩展名(atomicPast)的文件名,并将其传递到del sys.modules[…]
但是,此时atomicPast还没有完全导入(我想是吧?),因此尝试取消对它的导入并没有真正意义,并引发异常:
导入原子过去
2014-10-31 10:42:32.368000
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ImportError:在sys.modules中找不到加载的模块atomicPast
但有趣的是,不重要的工作,我可以重复执行import atomicPast
我想我可以处理异常并消除错误打印
在文件中:
...
try:
del sys.modules[ inspect.getfile(inspect.currentframe())[0:-3] ] #1
except ImportError:
pass
这是行不通的。我仍然得到同样的例外
进一步分析:
try:
#del sys.modules[ inspect.getfile(inspect.currentframe())[0:-3] ]
import cowabunga
except ImportError:
print "in except"
以上工作如预期,导入cowabunga会导致导入恐怖并被捕获
因此,我不得不意识到,某些场景中的某些异常可能无法捕获 不要使用导入来执行命令或调用函数。正确的方法是这样写: 原子性
import datetime
def time_now():
print datetime.now()
然后从python控制台导入atomicPast()和time_now()
Import命令用于导入库而不是执行代码,它不像php导入那样工作。读这里
还有这里
我的建议是,只有在你知道自己在做什么的情况下才使用sys.modules。首先,导入一个模块以产生副作用是非常糟糕的风格;将代码放入函数中,导入并执行该函数。其次,导入错误不是由您的
del
引起的(如果模块不存在,这将导致一个KeyError,而不是ImportError),而是由python导入机制的内部产生的,在加载文件后无法再找到模块(因为您已经删除了它)。因此,您无法在模块内捕获该异常;你可以在导入时抓住它,但这仍然是一种糟糕的风格。