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"]
    ...

inspect モジュールを試してみましたが、サポートされていないことがわかりました: http://docs.python.org/library/inspect.html#inspect.getmembers

情報をありがとう

4

5 に答える 5

3

dirはメタクラスでも機能しないため__dict__、その出力を使用してからフィルタリングすることをお勧めします。

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

そして、これが私のインスタンスにとって何を意味するかに応じて、私はそれを理解しようとします。

しかし、実際に渡されるパラメーターについてはあまり気にしません。私のインスタンスは、渡されたものに基づいてそれ自体を構成します。

もちろん、サードパーティのクラスをラップして必要なことを正確に実行するクラスデコレータを作成することもできますが、この場合は正当化できないと思われるオーバーヘッドです。

于 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

クラスの属性を次のように出力できます。

print dir( Column )

これは、私があなたの質問を正しく理解している場合です

于 2012-09-04T11:31:15.133 に答える
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 に答える