您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

是否可以在Python中创建动态本地化范围?

5b51 2022/1/14 8:23:37 python 字数 5435 阅读 594 来源 www.jb51.cc/python

我有一个场景,我在运行时动态运行函数,需要跟踪“本地化”范围.在下面的示例中,“startScope”和“endScope”实际上将创建“嵌套”级别(实际上,此本地化作用域中包含的内容不是打印语句...它是在其他地方发送数据的函数调用和嵌套跟踪那里.startScope / endScope只设置用于开始/结束当前嵌套深度的控制标志.这一切都适用于跟踪嵌套数

概述

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中创建动态本地化范围?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶