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

时间:2014-09-30 09:58:01

标签: python

我现在必须学习Python。

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

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

我要做的就是运行并打印然后我知道。

我还没有习惯这个。

  1. 如何习惯这个?
  2. 我应该创建一些类来表明类型吗?
  3. 一般规则是什么?

3 个答案:

答案 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插件可用于不同的风格。