获取函数的args数

时间:2016-02-23 15:12:43

标签: python python-2.7 class inline subclassing

我有一个模块ui。我想得到ui定义的所有类的列表,它们是ui.View的子类,可以不带参数调用。

我尝试过以下代码:

ui_elements=[d for d in ui.__dict__.values() if type(d)==type and inspect.getargspec(d.__init__)[0]==1 and isinstance(d(),ui.View)]

但是我从inspect模块中得到以下错误:

TypeError: <slot wrapper '__init__' of 'object' objects> is not a Python function

我正在使用inspect而不是try: except:,因为事先检查似乎比尝试检查它是否有效更好。

那么,我如何获得子类ui.View的所有类的列表,并且不需要创建参数?如果可能的话,我想内联这样做,我也想避免使用try: / except:语句。

2 个答案:

答案 0 :(得分:1)

如评论中所述,您应该使用try/catch,但如果您真的想这样做...

首先,使用inspect检查您的符号是否为类,按照注释中的建议使用issubclass,并且您希望参数的数量为1,而不是第一个参数为1.所以,像这样:

ui_elements = [ d for d in ui.__dict__.values()
    if (inspect.isclass(d) and
        issubclass(d, ui.View) and
        inspect.ismethod(d.__init__) and
        len(inspect.getargspec(d.__init__)[0]) == 1) ]

答案 1 :(得分:1)

要使用try / except获取列表理解,您可以使用本地函数:

def tryCreate(class_):
  try:
    return class_()
  except:
    return None

ui_elements = set(tryCreate(d) for d in ui.__dict__.values()
    if issubclass(d, ui.View)) - set(None)

好的,它最终是一种理解; - )