我现在必须学习Python。
我觉得它与强类型语言(例如OCaml和Java)完全相反,而且类型的东西在很大程度上消失了。
例如,当我阅读某人的代码时,我不知道输入是什么以及输出是什么。有时候,它可以是一个dict列表,其值是一个dict,其值也是一个列表。
我要做的就是运行并打印然后我知道。
我还没有习惯这个。
答案 0 :(得分:1)
评论,文档字符串和文档测试在帮助您弄清楚函数期望输入/输出方面有很长的路要走。 Python 3还添加了类型注释,解释器不会将其用于任何内容,但会极大地帮助读者:
def find_key_max(d:dict): return max(d.keys()) def find_value_max(d:dict): return max(d.values())
通过给函数提供有用的名称并添加类型注释,我已经清楚地说明了这些函数的用途。评论本来会更有帮助:
def find_key_max(d:dict):
"""Finds the largest key in the dictionary d"""
return max(d.keys())
当然,这仅适用于输入参数类型真正重要的情况。 Python的神奇之处在于,确切类型通常无关紧要。如果我在上面的方法中传入list
而不是dict,则错误消息将清楚地说出问题所在。通过简单的烟雾测试很容易发现这些错误。
此外,许多程序员(包括我自己)认为他们不需要编辑器看着他们告诉他们我是否可以调用MyObject.my_method
。如果我愿意,我会,让我的方式,编译!相信我,我知道我在做什么。这种理念让你可以更快地编写代码,因为你不必为了取悦编译器而工作。如果某些东西像鸭子一样嘎嘎叫(它有一个quack
方法),那么它的类型为Duck
。我不在乎编译器是否认为它是Chicken
类型,它会嘎嘎叫,因此会完成这项工作。
答案 1 :(得分:1)
尝试专注于您希望代码执行的操作,而不必担心类型。这是一个清单吗?或者是一些包含在列表中的自定义类?如果你需要迭代它,那么你现在真的不需要知道。您关心的内容不是容器的细节。所以Python提供了迭代,允许你做类似的事情:
for each in stuff:
do_something(each)
同样,如果你想看看某个容器是in
某个容器还是你可以使用的容器:
if something in stuff:
do_something(stuff)
# or perhaps in some other cases:
something.some_method()
# or
stuff.do_it_with(something)
...无论内容是列表,集合,字典,元组,SQL查询结果集,DBM映射(索引文件)等都无关紧要。这些都是实现细节。< / p>
当你有一个对象时,你关心它是否实现了你试图调用的语义。该对象是否是某种类型的 ...或者它是某种代理或包装在该类型的某个实例周围......还是某种提供相同功能的替代类型。在Python中,所有这些都被视为无关紧要。如果它提供了方法(承诺所需的语义),那么调用它们。如果您需要处理对象不支持所需方法的可能性,请将调用包装在异常处理程序中(try:
... except ...
)。
(我意识到我的代码可能看起来毫无意义。它是有效的代码;但是你的问题足够抽象,很难给出一个有意义的例子。我想说的是这一点。是Python编码允许您专注于语义而不是类型/转换细节。)
答案 2 :(得分:0)
如果你真的需要知道它是什么类型使用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插件可用于不同的风格。