获取函数的参数数量

Get number of args for function

我有一个模块,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: 语句。

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

首先,使用 inspect 检查您的符号是否为 class,按照评论中的建议使用 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) ]

要使用 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)

好吧,最后就是套路理解了;-)