标签: introspection

如何在当前模块中获取类的所有实例

我有一个foo定义类的模块Foo,并实例化该类的许多实例.

从其他模块,我可以import foo获取Foo实例化的对象列表:

[getattr(foo,f) for f in dir(f) if isinstance(getattr(foo,f), foo.Foo)]
Run Code Online (Sandbox Code Playgroud)

如果我能从模块中做到这一点会很方便foo.但正如所写的那样,这个名字foo在内部毫无意义foo,而改变self则无济于事.

有没有办法在这个模块中使用内省来查找这个类的所有实例?我希望有一种方法可以避免列出并附加每个实例.

python module introspection

3
推荐指数
1
解决办法
4229
查看次数

我在哪里可以获得反射修改值的列表?

这个函数524320为我的一个类返回.如果我通过getModifierNames运行它,它会告诉我:

>> Reflection::getModifierNames(524320)
array (
  0 => 'abstract',
)
Run Code Online (Sandbox Code Playgroud)

这是正确的,但524320不是2的幂,所以它必须有一些其他标志?实际上,如果我们看一下它的二进制表示,10100111看起来它有5个标志设置.那么其他4是什么,我在哪里可以找到所有这些的列表?

编辑:现在我很困惑...... 10000000000000100000根据这个,实际上是代表.这是有道理的,因为它对应于"显式抽象类".哦......我敢打赌这是一个溢出的问题,现在我正在考虑......必须再多调查一下.

php reflection introspection

3
推荐指数
1
解决办法
133
查看次数

SQLAlchemy内省

我想要做的是从SqlAlchemy实体定义获取它的所有列(),确定它们的类型和约束,以便能够预先验证,转换数据并向用户显示自定义表单.

我怎么能反省呢?

例:

class Person(Base):
    '''
        Represents Person
    '''
    __tablename__ = 'person'

    # Columns
    id = Column(String(8), primary_key=True, default=uid_gen)
    title = Column(String(512), nullable=False)
    birth_date = Column(DateTime, nullable=False)
Run Code Online (Sandbox Code Playgroud)

我想得到这个id,标题,出生日期,确定他们的限制(例如标题是字符串,最大长度是512或birth_date是日期时间等)

谢谢

python sqlalchemy introspection

3
推荐指数
1
解决办法
2440
查看次数

如何在运行时确定Scala类的属性?

我想以编程方式在运行时确定Scala类的所有属性.例如,对于下面的Scala类,我想确定方法name1,name3,name4,和name5是为干将的性质A:

class A(val name1: String, private val name2: String) {
  val name3 = ""
  var name4 = ""
  def name5 = ""
  def name6() = ""
}
Run Code Online (Sandbox Code Playgroud)

大多数工作都可以使用Java的反射API完成.遗憾的是我没能检测之间的差异name5name6().因此,我开始使用ScalaSigParser下一个试验,但ScalaSig的标志对name5name6()是不幸的也是相同的.这是我的代码:

def gettersOf(clazz: Class[_]) = {
  for (ssig <- ScalaSigParser.parse(clazz))
  yield {
    ssig.symbols.toList.collect{
      case m: MethodSymbol => m
    }.filter(m => (m.symbolInfo.flags & 0xFFFFF) == 0x200)
  }
}

gettersOf(classOf[A]).get.foreach{m =>
  println(m.name + ": " + m) …
Run Code Online (Sandbox Code Playgroud)

reflection scala runtime introspection

3
推荐指数
1
解决办法
3574
查看次数

Lua:获取功能源

我正在开发一个用于序列化/反序列化的系统,我正在尝试使用函数来获得一些非常奇特的东西.我的目标是以人类可读和可逆的方式序列化包含函数的对象(序列化文件需要在loadfile()步骤之后进行处理).我需要一种方法来获取函数的实际来源,看起来我不能总是用debug.getinfo()来做.

我知道debug.getinfo()将给出定义它的文件和行(或函数的来源,具体取决于它的来源).有没有办法可以从该文件中读取函数文本?我愿意使用某种解析器实用程序来实现这一点.也许有用于解析Lua代码的Lua包?

也许有一种方法可以让loadfile()或require()在某处自动保留函数源?

是的,我知道你可以从debug.getinfo中获取各种信息,但它无法处理通过stdin加载的函数...

uberblah@glade-m:~$ lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
> a = function() print("hello, world!") end
> require("serpent")
> s = require("serpent")
> =s.block(debug.getinfo(a))
{
  currentline = -1,
  func = loadstring("LuaQ\000\000\000\000\000\000\000\000\000=stdin\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A@\000\000@\000\000?\000\000\000\000\000\000\000\000\000\000\000print\000\000\000\000\000\000\000\000hello, world!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",'@serialized') --[[function: 0x2068a30]],
  lastlinedefined = 1,
  linedefined = 1,
  namewhat = "",
  nups = 0,
  short_src = "stdin",
  source = "=stdin",
  what = "Lua"
} --[[table: 0x206cf80]]
> f = io.open("stdin", "r")
> =f
nil
Run Code Online (Sandbox Code Playgroud)

来自STDIN的源解决方​​案... 1)捕获所有STDIN,将其写入文件2)从该文件加载信息,而不是从stdin加载3)debug将跟踪该文件中的函数行号

debugging lua serialization introspection

3
推荐指数
1
解决办法
1540
查看次数

在Ruby中,有没有办法找到响应方法调用的类?

所以,在Ruby中,如果我的类层次结构看起来像(非常符号)

A< B< C<Object

并且有一个"foo"在类中定义的方法C,是否有一些内省允许我确定这C是定义响应方法的类A.new.foo

ruby introspection

3
推荐指数
1
解决办法
76
查看次数

为什么我不能使用inspect.getsource()来查看列表的来源?

我试图list使用该inspect模块检索该类的源代码,但没有成功:

>>> import inspect
>>> inspect.getsource(list)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/inspect.py", line 701, in getsource
    lines, lnum = getsourcelines(object)
File "/usr/lib/python2.7/inspect.py", line 690, in getsourcelines
    lines, lnum = findsource(object)
File "/usr/lib/python2.7/inspect.py", line 526, in findsource
    file = getfile(object)
File "/usr/lib/python2.7/inspect.py", line 408, in getfile
    raise TypeError('{!r} is a built-in class'.format(object))
TypeError: <module '__builtin__' (built-in)> is a built-in class
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这不工作- 该文档inspect.getsource()称,

如果无法检索源代码,则会引发IOError.

......但不解释为什么会发生这种情况(无论如何我得到了一个TypeError,而不是一个IOError). …

python list introspection python-internals

3
推荐指数
1
解决办法
1698
查看次数

获取模块ruby中定义的所有类

是否可以知道ruby中模块内定义的所有类.

module A
  class Klass
  end
  class Klass1
  end
end
Run Code Online (Sandbox Code Playgroud)

是否有任何ruby内省方法来获取模块A中定义的所有类?

ruby module introspection

3
推荐指数
1
解决办法
1994
查看次数

pytest fixture对内省调用函数

我有一个测试类和一个如下所示的设置函数:

@pytest.fixture(autouse=True, scope='function')
def setup(self, request):
    self.client = MyClass()
    first_patcher = patch('myclass.myclass.function_to_patch')
    first_mock = first_patcher.start()
    first_mock.return_value = 'foo'
    value_to_return = getattr(request, 'value_name', None)
    second_patcher = patch('myclass.myclass.function_two')
    second_mock = second_patcher.start()
    second_mock.return_value = value_to_return
    #could clean up my mocks here, but don't care right now
Run Code Online (Sandbox Code Playgroud)

我在pytest的文档中看到,可以对模块级别值进行内省:val = getattr(request.module,'val_name',None)

但是,我希望能够根据我所在的测试指定不同的值来返回.所以我正在寻找一种方法来反省test_function而不是test_module.

http://pytest.org/latest/fixture.html#fixtures-can-introspect-the-requesting-test-context

python introspection fixtures pytest

3
推荐指数
1
解决办法
1926
查看次数

如何列出您在谷歌协议缓冲区中定义的属性?

我有一个谷歌协议缓冲区定义,看起来像跟随:

message Foo {
   required string Name = 1;
   optional string Address = 2;
   optional string NickName = 3;
   optional  int32  height = 4;
}
Run Code Online (Sandbox Code Playgroud)

现在在python中,我想列出上面的所有属性,但只列出那些属性.但是,交互式python,我看到谷歌定义了更多的字段.所以这似乎有问题.

我已经看了一些关于内省的stackoverflow帖子.有一个看起来不错的检查模块,但问题是谷歌协议缓冲区为我定义的其他成员.

有办法吗?

这就是我想做的事情.我有一个python实用程序,从命令行填写上述字段.我使用argparse,我会:

parser = argparse.ArgumentParser(...)
parser.add_argument( "--attribute_name", blah)
Run Code Online (Sandbox Code Playgroud)

我想将add_argument()放在循环中,并根据proto文件定义使其动态化.基本上,每次我更改proto文件时,我都不想继续修改实用程序的代码.好像我应该能够在python中做到这一点.我只是不知道如何.

有人有建议吗?

谢谢.

有关其他信息,我采用上面的示例,并使用protoc编译它.这是交互式输出:

>>> import hello_pb2
>>> h = hello_pb2.Foo()
>>> dir(h)
['ADDRESS_FIELD_NUMBER', 'Address', 'ByteSize', 'Clear', 'ClearExtension', 'ClearField', 'CopyFrom', 'DESCRIPTOR', 'FindInitializationErrors', 'FromString', 'HEIGHT_FIELD_NUMBER', 'HasExtension', 'HasField', 'IsInitialized', 'ListFields', 'MergeFrom', 'MergeFromString', 'NAME_FIELD_NUMBER', 'NICKNAME_FIELD_NUMBER', 'Name', 'NickName', 'ParseFromString', 'RegisterExtension', 'SerializePartialToString', 'SerializeToString', 'SetInParent', '_InternalParse', '_InternalSerialize', '_Modified', '_SetListener', '__class__', '__deepcopy__', …
Run Code Online (Sandbox Code Playgroud)

python introspection protocol-buffers argparse

3
推荐指数
1
解决办法
2337
查看次数