我应该经常创建一个类来指示python中的类型吗?

我应该经常创建一个类来指示python中的类型吗?,python,Python,我现在必须学习Python 我觉得它实际上与强类型语言(如OCaml和Java)完全相反,类型的东西在很大程度上已经消失了 例如,当我阅读某人的代码时,我不知道输入和输出是什么。有时,它可以是一个dict列表,其值是一个dict,其值又是一个列表 我要做的是运行它并打印它,然后我就知道了 我还不习惯这样 如何适应这个 我应该创建一些类来指示类型吗 一般规则是什么 注释、文档字符串和文档测试在帮助您了解函数期望的输入/输出方面有很大的帮助。Python 3还添加了类型注释,解释器不使用这些注释,但

我现在必须学习Python

我觉得它实际上与强类型语言(如OCaml和Java)完全相反,类型的东西在很大程度上已经消失了

例如,当我阅读某人的代码时,我不知道输入和输出是什么。有时,它可以是一个dict列表,其值是一个dict,其值又是一个列表

我要做的是运行它并打印它,然后我就知道了

我还不习惯这样

  • 如何适应这个
  • 我应该创建一些类来指示类型吗
  • 一般规则是什么

  • 注释、文档字符串和文档测试在帮助您了解函数期望的输入/输出方面有很大的帮助。Python 3还添加了类型注释,解释器不使用这些注释,但可以极大地帮助读者:

    def find_key_max(d:dict): return max(d.keys()) def find_value_max(d:dict): return max(d.values()) 当然,这只适用于输入参数类型真正重要的情况。Python的神奇之处在于,通常情况下,确切的类型并不重要。如果我在上面的方法中传入了
    列表
    ,而不是dict,那么错误消息将清楚地说明问题所在。这种错误很容易通过简单的烟雾测试发现


    除此之外,许多程序员(包括我自己)觉得他们不需要一个编译器在背后告诉他们我是否可以调用
    MyObject.my_方法。如果我想,我会,让开,编译器!相信我,我知道我在做什么。这一理念让您可以更快地编写代码,因为您不必为了取悦编译器而工作。如果某个东西像鸭子一样嘎嘎叫(它有一个
    嘎嘎
    方法),那么它是
    鸭子
    类型。我不在乎编译器是否认为它是
    Chicken
    类型,它会嘎嘎作响,从而完成这项工作

    试着专注于你想让你的代码做什么,不要担心类型。那是一张单子吗?或者是围绕列表的某个自定义类?如果您需要迭代它,那么实际上现在不需要知道。您关心的是容器的内容,而不是容器的细节。因此Python提供了迭代,允许您执行以下操作:

    for each in stuff:
        do_something(each)
    
    类似地,如果您想查看某个东西是否在某个容器中
    ,而不是您可以使用的:

    if something in stuff:
        do_something(stuff)
        # or perhaps in some other cases:
        something.some_method()
        # or
        stuff.do_it_with(something)
    
    。。。不管内容是列表、集合、字典、元组、SQL查询结果集、DBM映射(索引文件)等等,这些都是实现细节

    当您拥有一个对象时,您关心它是否实现了您试图调用的语义。该对象是否属于某一类型。。。或者它是否是某种代理或围绕该类型的某个实例的包装器。。。或者提供相同功能的其他类型。。。在Python中,所有这些都被视为无关的。如果它提供了方法(承诺所需的语义),则调用它们。如果需要处理对象不支持所需方法的可能性,则将调用包装在异常处理程序中(
    尝试:
    除外…


    (我意识到我的代码可能看起来毫无意义。它是有效的代码;但您的问题非常抽象,很难给出一个有意义的示例。我试图指出的一点是,Python编码允许您关注语义,而不是类型/类型转换细节).

    如果您确实需要知道它是什么类型,请使用isinstance方法

    if isinstance(variable, int):
        # Do integer stuff here
    
    或者,如果要强制输入特定类型

    def my_funciton(in):
        assert isinstance(in, int), "in is not an integer!"
    
    我建议您一如既往地记录所有内容

    def my_function(in):
        """calculate some result.
    
        Args:
            in (int): This is an integer input
    
        Return:
            (int): the input variable multiplied by 2
        """
        return in*2
    # end my_function
    

    有许多不同的方法可以用python来记录代码。我建议你找一些和狮身人面像兼容的东西。有几种sphinx插件可用于不同的样式。

    适合您。通常的方法是:函数的好docstring、描述性变量名和大量的单元测试这是docstring-不是注释:)好吧,它也是注释,因为它不是可执行代码。但我同意你的观点:)好吧。。。注释无法通过解析阶段,因此字节码无法使用注释,而docstring可以绑定到适当的方法,并在以后为doc string/docs工具等检索。。。我得说它们是相当明显的:)我认为你的答案中描述的优势对代码编写者来说似乎是好的,但对读者来说不是?我的意思是,例如,对于
    东西。用(某物)
    做它。如果我拿了你的代码,不知道什么是东西或某物,我唯一能做的就是尝试,如果失败,我会找出原因。这就是范例吗?在阅读Python代码时,您通常希望关注正在实现的语义,而不是所涉及的类型。当试图充分理解代码以对其进行更改时,您必须钻回到类/类型,以便调查任何其他方法(以及,正如您所说的,返回值)。通常,最简单的方法是启动iPython(或者只是Python解释器)。。。实例化适当类的对象,并使用内省查看其方法和iPython的?(帮助)magic或“pydoc”以及您的浏览器来读取其文档字符串。
    def my_function(in):
        """calculate some result.
    
        Args:
            in (int): This is an integer input
    
        Return:
            (int): the input variable multiplied by 2
        """
        return in*2
    # end my_function