我有一个模块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:
语句。
答案 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)
好的,它最终是一种理解; - )