Python 获取函数的参数数
我有一个模块,Python 获取函数的参数数,python,python-2.7,class,inline,subclassing,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 '__in
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
TypeError:不是Python函数
我使用的是inspect
而不是try:
除了:
,因为事先检查似乎比试着看看它是否有效更好
那么,我怎样才能得到所有子类
ui.View
且不需要参数来创建的类的列表呢?如果可能的话,我希望以内联方式执行此操作,并且我还希望避免使用try:
/语句,除了:
语句 如评论中所述,您应该使用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) ]
若要使用
获得列表理解,请尝试
/除了
之外,您可以使用本地函数:
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)
好的,最后是一套理解;-) 请注意,您可以使用
issubclass
,而不是尝试初始化它们。此外,您可以将没有使用参数初始化它们视为它们需要参数的标志-为什么要求内联/notry
?@jornsharpe我想我认为try
是一种非常符合python风格的计算参数的方法。有更好的方法吗?计算参数不是很像Python!处理错误是惯用的;“请求原谅比允许更容易”。你能退一步,描述一下你试图解决的更广泛的问题吗?我使用的Python发行版包含一个ui
模块。它有很多不同的UI元素,所有这些元素都是子类UI.View
。我想为每种类型的ui元素创建一个带有子视图的ui.View
。为了简单起见,我避免使用那些需要额外论证的论点。你不能事先检查,这是我们分歧的核心。如果检查参数的数量,可能会得到周二无法实例化的类。但是你不会得到那些背景颜色有可选参数的。这将是两个错误的谓词。您仍然没有给出为什么事先检查比尝试和处理错误更好的理由。我接受这一点是因为try/catch
,但是理解仍然会抛出TypeError
,即不是Python函数
是的,这是因为您的类根本没有init方法。所以我猜你的视图
类没有,或者它会被继承。我编辑了我的代码来处理这个。。。但是你可能想用阿尔夫的答案来代替:)是的,是的。试一下/抓住就够了。我的一个问题是,如果它没有init,为什么ui.TextField.\uuuu init\uuuuu
会返回插槽包装器(不管是什么),而不是引发AttributeError
?这是因为后面有一个C类,请参见: