概述
def startScope():
#Increment our control object's (not included in this example) nesting depth
control.incrementNestingDepth()
def endScope():
#Decrement our control object's (not included in this example) nesting depth
control.decrementNestingDepth()
def myFunction():
print "A"
print "B"
startScope()
print "C"
raise Exception
print "D"
print "This print statement and the prevIoUs one won't get printed"
endScope()
print "E"
def main():
try:
myFunction()
except:
print "Error!"
>>> main()
A
B
C
Error!
E
>>>
class Log(object):
"""
Log class
"""
def __init__(self):
#DataModel is defined elsewhere and contains a bunch of data structures / handles nested data / etc...
self.model = DataModel()
def Warning(self,text):
self.model.put("warning",text)
def ToDo(self,text):
self.model.put("todo",text)
def Info(self,text):
self.model.put("info",text)
def StartAdvanced(self):
self.model.put("startadvanced")
def EndAdvanced(self):
self.model.put("endadvanced")
def AddDataPoint(self,data):
self.model.put("data",data)
def StartTest(self):
self.model.put("starttest")
def EndTest(self):
self.model.put("endtest")
def Error(self,text):
self.model.put("error",text)
#myScript.py
from Logger import Log
def test_alpha():
"""
Crazy contrived example
In this example,there are 2 levels of nesting...everything up to StartAdvanced(),and after EndAdvanced() is included in the top level...everything between the two is
contained in a separate level.
"""
Log.Warning("Better be careful here!")
Log.AddDataPoint(fancyMath()[0])
data = getSerialData()
if data:
Log.Info("Got data,let's continue with an advanced test...")
Log.StartAdvanced()
#NOTE: If something breaks in one of the following methods,then GOTO (***)
operateOnData(data)
doSomethingCrazy(data)
Log.ToDo("Fill in some more stuff here later...")
Log.AddDataPoint(data)
Log.EndAdvanced()
#(***) Ideally,we would resume here if an exception is raised in the above localized scope
Log.Info("All done! Log some data and wrap everything up!")
Log.AddDataPoint({"data": "blah"})
#Done
#framework.py
import inspect
from Logger import Log
class Framework(object):
def __init__(self):
print "Framework init!"
self.tests = []
def loadTests(self,file):
"""
Simplifying this for the sake of clarity
"""
for test in file:
self.tests.append(test)
def runTests(self):
"""
Simplifying this for the sake of clarity
"""
#test_alpha() as well as any other user tests will be run here
for test in self.tests:
Log.Starttest()
try:
test()
except Exception,e :
Log.Error(str(e))
Log.Endtest()
#End
@contextlib.contextmanager
def swallower():
try:
yield
except ZeroDivisionError:
print("We stopped zero division error")
def foo():
print("This error will be trapped")
with swallower():
print("Here comes error")
1/0
print("This will never be reached")
print("Merrily on our way")
with swallower():
print("This error will propagate")
nonexistentName
print("This won't be reached")
>>> foo()
This error will be trapped
Here comes error
We stopped zero division error
Merrily on our way
This error will propagate
Traceback (most recent call last):
File "
总结
以上是编程之家为你收集整理的是否可以在Python中创建动态本地化范围?全部内容,希望文章能够帮你解决是否可以在Python中创建动态本地化范围?所遇到的程序开发问题。
如果您也喜欢它,动动您的小指点个赞吧