隐式访问当前进程范围中可用的变量,但不在Python的当前模块中

隐式访问当前进程范围中可用的变量,但不在Python的当前模块中,python,python-3.x,module,scope,global-variables,Python,Python 3.x,Module,Scope,Global Variables,我正在创建一个平台,在这个平台上,用户可以编写我的应用程序能够理解的基于key:value的配置。在这些配置中,我提供了编写和调用python代码段的支持。如下所示: def func(self, x): import MyClass return MyClass(x, self.attr1) attr1 val1 attr2 func(self, x) attr3 MyClass(x) 可以看出,任何值都可能依赖于配置中的其他值,对于这些值,像self这样的对象在作用域中可

我正在创建一个平台,在这个平台上,用户可以编写我的应用程序能够理解的基于key:value的配置。在这些配置中,我提供了编写和调用python代码段的支持。如下所示:

def func(self, x):
    import MyClass
    return MyClass(x, self.attr1)

attr1 val1
attr2 func(self, x)
attr3 MyClass(x)
可以看出,任何值都可能依赖于配置中的其他值,对于这些值,像self这样的对象在作用域中可用。请注意attr2和attr3,它们都创建了同一类的对象,但作用域不同

  • attr2评估python函数并将对self的引用传递给作用域。此函数还需要将所需信息从self传递给MyClass构造函数
  • attr3直接调用构造函数,但由于该对象是在config对象的范围内创建的,因此其引用可用作MyClass对象的父对象,并且在内部使用self.parent.attr1进行创建
  • 这将最终为我的应用程序创建类似的对象,即attr2==attr3

    从用户的角度来看,当MyClass需要来自self的许多属性时,这可能会很麻烦,他们需要手动添加所有这些属性。其次,无论是通过config还是python函数,最好为用户提供一种同质的对象创建方法,因为两者都存在于相同的外部作用域中。因此,我希望提供以下方法来定义attr2,它的工作原理应该与上面的attr3类似:


    是否有任何方法可以隐式地理解特定于应用程序的对象的上下文,这些对象将在客户机代码中创建?

    到目前为止,我已经评估并放弃了以下方法:1。使自我全球化。2.用户将self传递给MyClass。3.通过字符串操作修改用户的代码。我不知道您的用例,但是如果用户可以使用python代码段,为什么不提供一个API,让用户编写完整的配置脚本,而不是这种复杂的配置和python混合体?@Xtrem532我的应用程序的主要界面是配置。我的主要目标受众是天真的用户,他们只知道为自己的用例编写小python脚本。为他们提供一些易于使用的配置函数和一个带有大注释的模板文件
    “您的配置在这里”
    可能比这个奇怪的python/键值配置组合工作得更好
    def func(x):
        import MyClass
        return MyClass(x)
    
    attr1 val1
    attr2 func(x)