2
class FooTable(Base):

    Id = Column(BIGINT, primary_key=True)
    name = Column(VARCHAR(256), nullable=False)
    username = Column(VARCHAR(256), nullable=False)
    state = Column(VARCHAR(100), nullable=False)
    city = Column(VARCHAR(256), nullable=False)
    zip = Column(VARCHAR(100), nullable=False)

我想打印出类 Column 的实例化参数。通常 - python 代码到字符串。例子:

for k, v in vars(FooTable).iteritems():
      print k, get_class_attr(v)


>>> Id ["BIGINT", "primary_key=True"]
>>> name ["VARCHAR(256)", "nullable=False"]
    ...

我尝试了检查模块,但发现它不支持它: http ://docs.python.org/library/inspect.html#inspect.getmembers

感谢您提供任何信息

4

5 回答 5

3

我建议使用__dict__然后过滤其输出,因为dir也不适用于元类。

def filterFunction(field):
    '''
    This is a sample filtering function
    '''
    name, value = field
    return not name.startswith("_")

for k, v in vars(FooTable).iteritems():
      print k, filter(filterFunction, v.__dict__.items())

对于以下课程的这种情况

class X():
  foo = "bar"
  baz = True

我们的过滤器

filter(filterFunction, X.__dict__.items())

会回来

[('foo', 'bar'), ('baz', True)]

要获取实例化参数,我会检查字段名称是否在Column.__init__.im_self

于 2012-09-04T11:41:29.297 回答
1

实际上,您要求的没有多大意义。Burhan Khalid 的回答很接近,但不是真的。您需要调用者在实例化类时传递的实际参数。不是函数/构造函数的签名。

但这是班级的程序员应该自己做的簿记。即便如此,他实际上也不会那样做。他会根据传递的参数对configure每个实例进行处理。

例如

class Foo(object):
    def __init__(self, *args, **kwargs):
        self.is_cool = kwargs.get('whatever', False)

然后我会检查实例属性:

f = Foo()
f.is_cool   # False

我会尝试理解它,这取决于这对我的实例意味着什么。

但我并不真正关心传递的实际参数。我的实例将根据传递的内容进行自我配置。

您当然可以编写一个包装任何 3rd 方类的类装饰器,并完全按照您的需要进行操作,但在这种情况下,这似乎是不合理的开销。

于 2012-09-04T12:18:57.953 回答
0

attrs = [i for i in dir(obj) if not i.startswith('_')]

请记住,以开头的属性_通常被认为是“私有的”。这是一个示例运行:

>>> [i for i in dir(4) if not i.startswith('_')]
['conjugate', 'denominator', 'imag', 'numerator', 'real']
>>> [i for i in dir('') if not i.startswith('_')]
['capitalize', 'center', ... 'split', 'splitlines', ... 'upper', 'zfill']
>>> class Foo:
...    a = 'Hello'
...    def __init__(self):
...      pass
...    def hello(self):
...      print 'Hello'
...
>>> [i for i in dir(Foo) if not i.startswith('_')]
['a', 'hello']
于 2012-09-04T11:38:15.487 回答
0

我想你正在寻找这个:

>>> class Foo:
...    def bar(a,b,c):
...       pass
...
>>> x = Foo()
>>> x.bar.func_code.co_varnames
('a', 'b', 'c')

这是另一种尝试,我认为这可以满足您的需要;虽然它有点令人费解。

>>> class Foo:
...    a = 'b'
...    def bar(y,z):
...       pass
... 

>>> funcs = [(i,getattr(Foo,i).func_code.co_varnames) for i in dir(Foo) \
...          if hasattr(getattr(Foo,i),'func_code')]
>>> 
>>> funcs
[('bar', ('y', 'z'))]

但是,如果您想知道将哪些参数传递给类,那么从实例中使用__dict__.

>>> class Foo:
...    a = ''
...    def __init__(self, b, c):
...        self.a = b
...        self.c = c
... 
>>> funcs = [(i,getattr(Foo,i).func_code.co_varnames) for i in dir(Foo) if hasattr(getattr(Foo,i),'func_code')]
>>> funcs
[('__init__', ('self', 'b', 'c'))]
>>> i = Foo(1,2)
>>> i.__dict__
{'a': 1, 'c': 2}
于 2012-09-04T12:03:03.230 回答
0

您可以使用以下命令打印类的属性:

print dir( Column )

这是如果我正确理解你的问题

于 2012-09-04T11:31:15.133 回答