是否有用于处理Python对象地址的Python模块?

Ram*_*hum -4 python namespaces object object-address

(当我说"对象地址"时,我的意思是你在Python中键入的用于访问对象的字符串.例如'life.State.step'.大多数时候,最后一个点之前的所有对象都是包/模块,但在某些情况下它们可以是班级或其他对象.)

在我的Python项目中,我经常需要使用对象地址.我必须完成的一些任务:

  1. 给定一个对象,获取其地址.
  2. 给定一个地址,获取对象,在途中导入任何所需的模块.
  3. 通过去掉冗余的中间模块来缩短对象的地址.(例如,'life.life.State.step'可能是对象的官方地址,但如果'life.State.step'指向同一个对象,我会想要使用它,因为它更短.)
  4. 通过"生根"指定的模块来缩短对象的地址.(例如,'garlicsim_lib.simpacks.prisoner.prisoner.State.step'可能是对象的官方地址,但我假设用户知道prisoner包的位置,所以我想'prisoner.prisoner.State.step'用作地址.)

是否有一个模块/框架来处理这样的事情?我写了一些实用程序模块来做这些事情,但如果有人已经编写了一个更成熟的模块来做这件事,我宁愿使用它.

一个注意事项:请不要试图向我展示这些东西的快速实现.它比看起来更复杂,有很多陷阱,任何快速脏代码都可能在许多重要情况下失败.这些任务需要经过实战考验的代码.

更新:当我说"对象"时,我主要是指类,模块,函数,方法,这些东西.很抱歉没有说清楚.

Tho*_*ers 5

简答:不.你想要的是不可能的.

答案很长,你认为对象的"地址"不是什么.life.State.step仅仅是在特定时间获得对象引用的方法之一.稍后相同的"地址"可以给你一个不同的对象,或者它可能是一个错误.更重要的是,你的这个"地址" 取决于背景.在life.State.step,最终对象不仅取决于什么life.Statelife.State.step什么life,而是取决于名称在该命名空间中引用的对象.

您的要求的具体答案:

  1. 最终对象无法找到您如何引用它,也没有任何代码可以提供给对象."地址"是不是一个名字,它不依赖于对象,它只是一个任意的Python表达式导致对象引用(就像所有的表情做的.)你只能使这项工作,几乎没有,与AREN特定对象"预计会移动,例如课程和模块.即便如此,这些对象可以左右移动,并经常走动,所以你尝试什么是可能打破.

  2. 如上所述,"地址"取决于许多事情,但这部分相当容易:__import__()并且getattr()可以给你这些东西.然而,它们将非常脆弱,特别是当涉及的内容多于属性访问时.它只能远程处理模块中的东西.

  3. "缩短"名称需要仔细检查每个可能的名称,即所有模块和所有本地名称及其所有属性.这将是一个非常缓慢且耗时的过程,并且面对任何带有__getattr____getattribute__方法的东西,或者具有不仅仅返回值的属性,都非常脆弱.

  4. 和3一样.

  • 不,一个类被它的名称和它在*中定义的模块的名称所腌制,而不是你所拥有的这个误导的"地址"概念.这就是嵌套类无法被pickle的原因.这也是为什么pickle对于任何一种不断发展的代码都非常糟糕的原因. (3认同)
  • 它确实没有改变答案.您可能希望忽略这些问题,但它们是真正的问题,现实世界的代码会遇到它们.正如我所提到的,你可以使用`__import __()`和`getattr()`来制作你想要的部分,但是没有什么可以使用的,并且会有一些荒谬的脆弱角落情况. (2认同)