【问题标题】:Python Introspection: How to get varnames of class methods?Python Introspection:如何获取类方法的变量名?
【发布时间】:2011-02-01 23:21:31
【问题描述】:

我想获取类方法的关键字参数的名称。我想我了解如何获取方法的名称以及如何获取特定方法的变量名称,但我不知道如何组合这些:

class A(object):
    def A1(self, test1=None):
        self.test1 = test1
    def A2(self, test2=None):
        self.test2 = test2
    def A3(self):
        pass
    def A4(self, test4=None, test5=None):
        self.test4 = test4
        self.test5 = test5

a = A()

# to get the names of the methods:

for methodname in a.__class__.__dict__.keys():
    print methodname

# to get the variable names of a specific method:

for varname in a.A1.__func__.__code__.co_varnames:
    print varname

# I want to have something like this:
for function in class:
    print function.name
    for varname in function:
        print varname

# desired output:
A1
self
test1
A2
self
test2
A3
self
A4
self
test4
test5

我必须将方法的名称及其参数公开给外部 API。我已经编写了一个扭曲的应用程序来链接到提到的 api,这个扭曲的应用程序必须通过 api 发布这些数据。

所以,我想我会使用类似的东西:

for methodname in A.__dict__.keys():
if not methodname.startswith('__'):
    print methodname
    for varname in A.__dict__[methodname].__code__.co_varnames:
        print varname

一旦环境稳定了,我会考虑更好的解决方案。

【问题讨论】:

  • python 2.5 不喜欢 A.__dict__[methodname].__code__.co_varnames -- 'function' 对象没有属性 'code' 使用 inspect 可能更稳定python 版本。

标签: python class introspection


【解决方案1】:
import inspect

for name, method in inspect.getmembers(a, inspect.ismethod):
    print name
    (args, varargs, varkw, defaults) = inspect.getargspec(method)
    for arg in args:
        print arg

【讨论】:

  • 我见过很多使用inspect模块的例子。为什么使用检查是个好主意?为什么不使用类自己的方法来完成这项工作?
  • @daccle:我猜inspect 在课堂允许这种级别的内省之前就已经存在了
  • 检查 api 是否干净。我认为使用它可以使代码更具可读性。
  • +1 这是(imo)正确的方法。 Eli Bendersky 回答中的所有双下划线都应该表明他在做一些可疑的事情;-)
【解决方案2】:

好吧,作为您所做工作的直接扩展:

for varname in a.__class__.__dict__['A1'].__code__.co_varnames:
    print varname

打印:

self
test1

P.S.:老实说,我觉得这可以做得更优雅......

例如,您可以将 a.__class__ 替换为 A,但您知道 ;-)

【讨论】:

  • 谢谢!如果您知道更好的解决方案,欢迎您。我星期一早上的大脑只是一点点......你知道...... ;-)
  • 向人们展示如何做傻事没有任何帮助。
  • @daccle:请更新您的问题,解释为什么需要自省以及为什么不能简单地阅读源代码。
  • @ironfroggy:人们有时会实现用于处理代码的工具(智能感知等),这需要使用这些技术。我不建议在任何“正常”代码中使用它
  • @S.Lott 源并不总是可用的,一方面。我知道这是 Python,但即便如此阅读源代码也比调用 help() 更难。
猜你喜欢
  • 1970-01-01
  • 2015-12-31
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
相关资源
最近更新 更多