我如何A从内部b.func()(即A实例self)内省实例:
class A():
    def go(self):
        b=B()
        b.func()
class B():
    def func(self):
        # Introspect to find the calling A instance here
如果我有一个函数的引用,我可以检查它的代码对象f.__code__,获取签名,然后对此签名执行后续检查以查看代码是否更改.这很好.但是,如果其中一个功能的依赖项发生了变化呢?例如
def foo(a, b):
    return bar(a, b)
让我们说foo保持不变,但bar改变了.有没有办法可以foo通过foo.__code__对象检查'依赖''live' (与解析文本和使用AST)?
我正试图在Perl 6中感到舒服.当我在REPL提示符下时,我在Python中发现的一件事就是我可以做一个dir(对象)并找出一个对象的属性,在Python中包含对象的方法.
这通常有助于提醒我想做什么; "哦,这是正确的,Python中的修剪被称为条带",就像那样.
在Perl 6中,我知道内省方法.WHO,.WHAT,.WHICH,.HOW和.WHY,但这些是在类或对象级别.我如何找出对象内部的内容,以及我可以对它做些什么?
我正在尝试为python编写自己的"marshal"代码,这样我就可以在Google App Engine上存储已编译的python代码,以动态的方式提供脚本.大家都可以验证,GAE不支持"marshal","pickle"不能序列化代码对象.
我发现我可以构造一个代码对象,types.CodeType()但它需要12个参数.
尽管我已经尝试过,但我找不到任何关于此调用的文档,我真的需要构建代码对象,以便我可以exec().我的问题是,有没有人知道这个types.CodeType()"构造函数" 的参数是什么或者是什么方式来反省它?我已经使用了这里info()定义的功能,但它只是吐出一般信息!
快速FAQ:
UPDATE
截至2011年7月7日,Google App Engine基础架构不允许实例化代码对象,因此我的论点没有实际意义.希望将来在GAE上得到修复.
python compiler-construction google-app-engine dynamic-cast introspection
在Clojure中进行内省的最佳方法是什么?是否有类似Python的dir功能?我特别感兴趣的是找到我正在与之互操作的java类上可用的方法,但我也有兴趣找到Clojure中与内省相关的任何东西.
考虑以下python代码:
def function():
    "Docstring"
    name = ???
    doc = ???
    return name, doc
>>> function()
"function", "Docstring"
我需要更换问号,以便从同一个函数中获取函数的名称和文档字符串?
编辑:到目前为止,大多数答案明确地硬编码其定义中的函数名称.是否可以执行类似下面的操作,其中新函数get_name_doc将从调用它的外框访问函数,并返回其名称和doc?
def get_name_doc():
    ???
def function():
    "Docstring"
    name, doc = get_name_doc()
    return name, doc
>>> function()
"function", "Docstring"
有一个庞大的python项目,其中一个类的一个属性在某些地方只有错误的值.
它应该是sqlalchemy.orm.attributes.InstrumentedAttribute,但是当我运行测试时它是常量值,让我们说字符串.
有一些方法可以在调试模式下运行python程序,并在每个步骤之后自动执行一些检查(如果变量更改类型)吗?
PS我知道如何在inspect和property decorator的帮助下记录类实例属性的变化.可能在这里我可以使用这种方法与元类...
但有时我需要更一般和更强大的解决方案......
谢谢.
PPS我需要类似的东西:https://stackoverflow.com/a/7669165/816449,但可能会更详细地解释该代码中发生的事情.
我想更改主键和引用此值的所有表行.
# table master
master_id|name
===============
foo|bar
# table detail
detail_id|master_id|name
========================
1234|foo|blu
如果我给出一个脚本或功能
 table=master, value-old=foo, value-new=abc
我想创建一个SQL片段,在所有引用表"master"的表上执行更新:
update detail set master_id=value-new where master_id=value-new;
.....
在内省的帮助下,这应该是可能的.
我用postgres.
更新
问题是,有许多表具有表"master"的外键.我想要一种方法来自动更新所有具有外键到主表的表.
是否有(标准化)方法使用c ++获取当前方法的名称?
使用GNU GCC你可以通过使用宏__FUNCTION__和__PRETTY_FUNCTION__(由2个下划线包围)来实现这一点,但是,这当然是不可移植的.有没有办法在标准c ++中实现这一点或使其可移植?
我有一个API,我正在变成一个内部DSL.因此,我的PoJos中的大多数方法返回对此的引用,以便我可以声明性地将方法链接在一起(语法糖).
myComponent
    .setID("MyId")
    .setProperty("One")
    .setProperty2("Two")
    .setAssociation(anotherComponent)
    .execute();
我的API不依赖于Spring,但我希望通过PoJo友好,零参数构造函数,getter和setter使其成为"Spring-Friendly".问题是,当我有一个非void返回类型时,Spring似乎没有检测到我的setter方法.
在将命令链接在一起时,返回类型非常方便,所以我不想破坏我的编程API,只是为了兼容Spring注入.
Spring中有一个设置允许我使用非void setter吗?
克里斯
introspection ×10
python ×5
reflection ×2
c++ ×1
clojure ×1
debugging ×1
dynamic-cast ×1
java ×1
pdb ×1
perl6 ×1
postgresql ×1
raku ×1
spring ×1
sql ×1