Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取函数的参数数_Python_Python 2.7_Class_Inline_Subclassing - Fatal编程技术网

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
,而不是尝试初始化它们。此外,您可以将没有使用参数初始化它们视为它们需要参数的标志-为什么要求内联/no
try
?@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类,请参见: