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