Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当python函数被修饰时,该修饰在哪些范围内可见?_Python_Python Import_Python Decorators - Fatal编程技术网

当python函数被修饰时,该修饰在哪些范围内可见?

当python函数被修饰时,该修饰在哪些范围内可见?,python,python-import,python-decorators,Python,Python Import,Python Decorators,例如。。。给定 环境(A)[其中加载模块(B)]提供了一个功能,例如“寄存器” 模块(C)[由(B)导入]提供一组实用程序,用于加载/运行其他脚本/模块/etc 模块(D)是其中一个“其他脚本”——它在其主线(最外层)范围内调用“register()”,因此 关于D的主要入口点(完成/启动D服务/工作的功能)以及其他项目(包括,例如参数和适当的默认值)的沟通- 及 模块(B)提供了一个函数(runScript(filename…),在调用时- a) 验证请求 b) 修饰“register”,以

例如。。。给定

  • 环境(A)[其中加载模块(B)]提供了一个功能,例如“寄存器”
  • 模块(C)[由(B)导入]提供一组实用程序,用于加载/运行其他脚本/模块/etc
  • 模块(D)是其中一个“其他脚本”——它在其主线(最外层)范围内调用“register()”,因此 关于D的主要入口点(完成/启动D服务/工作的功能)以及其他项目(包括,例如参数和适当的默认值)的沟通- 及
  • 模块(B)提供了一个函数(runScript(filename…),在调用时-
    • a) 验证请求
    • b) 修饰“register”,以便当(D)作为导入/加载的一部分被加载和执行时,“register”的调用由修饰器处理,修饰器捕获随后要调用的入口点
    • c) 调用c中的实用程序过程,该过程处理可用导入机制的细微差别,然后
      • i) 加载脚本(通过导入它)[哪个应该执行脚本,哪个应该执行注册函数调用,哪个应该调用decorator,哪个应该捕获并保存“已注册”的入口点],然后
      • ii)检索并调用保存的“已注册”入口点
  • (A)和(D)都不能修改-我们只能修改B和/或C中的代码

    似乎在调用B.runScript(文件名)时,除了包装器之外,其他一切都正常工作。脚本确实已加载[即,如果它有Do方法,将调用它。*1] 但是如果没有Do方法,注册就不能捕获入口点

    我为我的错误理解和/或误解/实施提前道歉

    模块B(runScript-runScript.py):

    模块C(应用程序(控制/仿真…)应用程序py):

    模块D(服务插件'moduleD.py'):

    环境(A): 坦率地说,因为我不能确切地看到环境(gimpfu)是如何建立这一点的,所以我只能猜测一个可能的等价问题:

    #!/usr/bin/python
    
    def register(name, a, b, c, d, e, f, g, h, i, entrypoint):
         print "Plugin "+name+ " Entrypoint "+str(entrypoint)
    
    import RunScript
    RunScript._runScript("moduleD")
    import _RunScript
    

    这最终归结为Python的静态作用域与动态作用域问题——因此,函数的作用域是静态的,仅在模块中可见,而不是它本身可能导入的任何模块


    评论:噢,见鬼。我猜在做了大量的系统编程工作后,我们将一个层“滑入”到功能堆栈中(拦截下层的服务请求,而不影响堆栈中上层的服务请求(发出服务请求),我希望有一种方法,某种方法,来完成同样的任务。[c'est la guerre]

    这最终归结为Python的静态作用域与动态作用域问题——因此,函数的作用域是静态的,仅在模块中可见,而不是它本身可能导入的任何模块


    评论:噢,糟透了。我想在做了大量的系统编程工作后,我们将一层“滑”到一个功能堆栈中,(拦截下层的服务请求而不影响堆栈中上层的服务请求)(发出服务请求),我希望会有一种方法,某种方法,实现同样的目标。[c'est la guerre]

    我承认我没有阅读整个问题,但代码中没有修饰函数……也许你误解了“修饰”的含义?我认为修饰:
    register=getEntryPoint(register)
    仅适用于模块B。
    寄存器
    变量是全局变量,但仅适用于模块B。如果另一个模块加载了D,它将看到原始变量。您可能正在进行修补。@Error syntacticalreform:但这是装饰器在幕后实际工作的方式。您能导出一个最小的工作示例@ChrysG吗?我认为答案很简单但是很难克服“墙”这个词(因为你的代码不可运行,所以测试任何东西都更加困难)。正如你在问题中提到的,函数修饰就是给一个对象指定一个名称,例如,当你做
    func=decorator(func)时
    然后使用此作用域的
    func
    名称的代码将使用修饰函数。当使用不同的名称时,更容易想象:
    func\u decordent=decorator(func)
    。所有访问
    func\u修饰的代码将使用修饰版本,所有访问
    func
    的代码将使用未修饰版本。与
    func=decorator(func)的唯一区别是
    这可能会覆盖名称
    func
    。使用不同的名称可以找到它。我承认我没有阅读整个问题,但代码中没有修饰函数…可能你误解了“修饰”的含义?我认为修饰:
    register=getEntryPoint(register)
    仅适用于模块B。
    寄存器
    变量是全局变量,但仅适用于模块B。如果另一个模块加载了D,它将看到原始变量。您可能正在进行修补。@Error syntacticalreform:但这是装饰器在幕后实际工作的方式。您能导出一个最小的工作示例@ChrysG吗?我认为答案很简单但是很难克服“墙”这个词(因为你的代码不可运行,所以测试任何东西都更加困难)。正如你在问题中提到的,函数修饰就是给一个对象指定一个名称,例如,当你做
    func=decorator(func)时
    然后使用此作用域的
    func
    名称的代码将使用修饰函数。当使用不同的名称时,更容易想象:
    func\u decordent=decorator(func)
    。所有访问
    func\u decordent
    的代码都将使用修饰版本,而所有访问
    func
    的代码都将使用未修饰版本。与
    func=decorator(func)
    的唯一区别是可能会覆盖名称
    func
    。使用不同的名称,您可以跟踪它。
    import sys
    import os
    import path
    import gimp
    # etc...
    plugin_EntryPoint = None
    
    def Do(procedureName, options)
        # ...
        if procedureName == 'RunScript':
            filename = options['FileName'}
            # determine import mechanisms available --
            isimport = False
            isimportSFL = False
            isimportUtil = False
            isimportable = False
            try:
                import imp
                isimport = True
            except:
                pass
            if not isimport:
                # try alternative version's loader mechanism versions...
                try:
                    from importlib.machinery import SourceFileLoader
                    isimportSFL = True
    
                except: 
                    pass
                if not isimportSFL:
                    try:
                        import importlib.util
                        isimportUtil = True
                    except:
                        pass
    
            plugin_EntryPoint = None
            if isimport:
                moduleD = imp.load_source("module_D", filename)
            elif isimportSFL:
                moduleD = SourceFileLoader("module_D", filename)
            elif isimportUtil:
                modspec = importlib.util.spec_from_file_location("module_D", filename)
                moduleD = importlib.util.module_from_spec(spec)
                spec.loader.exec_module(moduleD)
    
            if hasattr(moduleD, 'Do')
                moduleD.Do()                    # try conventional entry point...
            elif plugin_EntryPoint is None:     # try 'registered' entry point...
                raise AppTerminate, "no entry point registered"
            else
                pluginEntryPoint(App.plugin_Args)
        # ...
    
    def myEntrypoint():
        print "entered"
    
    register("myName", "", "", "", "", "", "", "", [], [], myEntrypoint)
    
    if __name__ == '__main__":
        main()
    
    #!/usr/bin/python
    
    def register(name, a, b, c, d, e, f, g, h, i, entrypoint):
         print "Plugin "+name+ " Entrypoint "+str(entrypoint)
    
    import RunScript
    RunScript._runScript("moduleD")
    import _RunScript