当前位置: 首页 > 知识库问答 >
问题:

如何指定参数是Python DocString中特定对象的列表

年凯康
2023-03-14

我非常喜欢在Python中使用docstring来指定项目超出一定大小时的类型参数。

我很难找到用于指定参数是特定对象列表的标准,例如,在Haskell类型中,我会使用[String]或[a]。

当前标准(可由PyCharm编辑器识别):

def stringify(listOfObjects):
    """
    :type listOfObjects: list
    """
    return ", ".join(map(str, listOfObjects))

我更喜欢什么:

选择1

def stringify(listOfObjects):
    """
    :type listOfObjects: list<Object>  
    """
    return ", ".join(map(str, listOfObjects))

选择2

def stringify(listOfObjects):
    """
    :type listOfObjects: [Object]
    """
    return ", ".join(map(str, listOfObjects))

我想这不是一个很好的例子——更相关的用例是列表中的对象必须是特定类型的。

更好的例子

class Food(Object):
    def __init__(self, calories):
        self.calories = calories

class Apple(Food):
    def __init__(self):
        super(self, 200)

class Person(Object):
    energy = 0
    def eat(foods):
        """
        :type foods: [Food]  # is NOT recognised by editor
        """
        for food in foods:
            energy += food.calories

所以,除了我饿了这一事实之外,这个例子说明了如果用错误类型的对象列表调用,代码就会中断。因此,记录的重要性不仅在于它需要一份清单,还在于它需要一份食物清单。

相关问题如何告诉PyCharm参数应为什么类型?请注意,我正在寻找一个比上面更具体的答案。

共有3个答案

甘学潞
2023-03-14

用python

type([1,2,3]) == type(['a', 'b', 'c'])

您还可以将字符串添加到整数列表中。

因此,对于您试图实现的目标,PyCharm必须在将其作为参数传递之前,神奇地检查您的整个代码,以了解您要添加到列表中的内容。

你可以看看这个问题Python:定义一个特定类型对象的列表

数组模块只允许基本值。

这里我能想到的唯一解决方案是创建自己的类,该类扩展python列表“FoodList”,可以在添加元素之前检查类型。

class Food():
    def __init__(self, calories):
        self.calories = calories

class FoodsList(list):
    #you can optionally extend append method here to validate type
    pass

def eat(foods):
    """
    :type foods: FoodsList
    """
    energy = 0
    for food in foods:
        energy += food.calories
    return energy


list = FoodsList()
list.append(Food(3))
list.append(Food(4))
print eat(list)
郁和通
2023-03-14

正如PyCharm文档中指出的,一种(传统的,PEP-484之前的)方法是使用方括号:

列表[Foo]:Foo元素的列表

口授[口授,口授]:口授从口授到口授

str列表,如已接受的答案所示,在PyCharm中无法按预期工作。

从Python 3.5和PEP-484的实现开始,您还可以使用类型提示,这可能是您的IDE/编辑器很好地支持的。这里解释了如何在PyCharm中轻松完成这一点。

本质上,使用类型暗示(Python)声明列表返回类型

from typing import List

"""
Great foo function.

:rtype: list[str]
"""
def foo() -> List[str]:
    return ['some string', 'some other string']

在这里,我们声明(有些冗余)函数foo返回字符串列表,都在类型hint-

其他预先声明的类型和更多信息可以在Python文档中找到。

太叔高义
2023-03-14

在PyCharm手册的评论部分,开发者给出了一个很好的提示:

#: :type: dict of (str, C)
#: :type: list of str

它对我很有效。现在我想知道在Python中记录参数化类的最佳方式是什么:)。

 类似资料:
  • 我想定义一个函数。将多个元素展平为一个数组的展平函数。我知道以下是不可能的,但基本上我想这样做: 我得到以下错误: 使用.reduce()重写.flant有什么好方法吗? 注意:我知道还有很多其他方法可以在javascript中展平数组,但是我想知道的是如何使用特定的参数来做到这一点。

  • 问题内容: 我想将某些类型为ParentClass的字段作为json字符串存储到我的数据库中。我不想使用Serializable接口和DataType.SERIALIZABLE导致它与序列化类的完整类名相关联。 所以我正在使用以下代码: 持久性类的一种: 这是我遇到的两个问题: 我没有得到如何指定从对象到字符串的自定义转换的信息。似乎ORMLite调用Object.toString()以获得对象的

  • 我有一个LINQ查询的情况。它有两个连接(一对多),但它会带回连接表中的所有列。我不确定如何创建LINQ查询,以便只从连接的表中返回几个字段。 这不管用。。。我得到一个错误:“o”不在范围内。 基本上输出应该如下: 会员资格 我是LINQ的新手,我已经为此奋斗了太久。

  • 问题内容: 我有一个对象列表。对象具有3个字符串属性。我想制作一个仅包含类中特定属性的列表。 有内置的功能可以做到这一点吗? 问题答案: 列表理解会很好地工作: 但是,由于您要求:-),所以有内置功能的组合。

  • 问题内容: 如果我有一个水果列表,其中包含各种实现,如,等。该列表是必需的,因为其他方法会对列表中的所有水果执行常规操作。 如何将特定类型的所有对象从列表中删除?例如所有的苹果?进行instanceof / if-else检查非常难看,尤其是在有许多不同的类时。 如何改善以下内容? 问题答案: 您应该知道-实例是不好的代码实践。 编写.getType()(返回的对象的枚举类型)怎么办?

  • 假设我有以下类及其接口 步骤1:使用Autofac在测试项目中设置构造函数: 步骤2:设置测试 现在,我如何注入配置器未知但“MyApplication”已知的参数“value”? 在我想要这么做之前 但是现在我正在尝试我们依赖反转和依赖注入,最终出现了上面描述的问题。