获取函数的参数数量
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)
好吧,最后就是套路理解了;-)
我有一个模块,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)
好吧,最后就是套路理解了;-)