当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) 修饰“register”,以便当(D)作为导入/加载的一部分被加载和执行时,“register”的调用由修饰器处理,修饰器捕获随后要调用的入口点
- c) 调用c中的实用程序过程,该过程处理可用导入机制的细微差别,然后
- i) 加载脚本(通过导入它)[哪个应该执行脚本,哪个应该执行注册函数调用,哪个应该调用decorator,哪个应该捕获并保存“已注册”的入口点],然后
- ii)检索并调用保存的“已注册”入口点
#!/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