当 writing/reading python 代码时,人们如何判断变量是否是对象?

When writing/reading python code how do people tell if a variable is an object or not?

例如,如果我正在阅读一些这样工作的代码:

list_of_objects = function_returning_object_list()
for object in list_of_objects:
    do_something(object.param)

是不是 object.get_param 有点奇怪看看你是否只是阅读代码而不知道 function_returning_object_list() 实际上 return 对象列表?如果没有变量类型,你如何通过命名约定避免这种混淆?

希望我说清楚了。

嗯,Python 中的所有内容确实是一个对象。这里适当的问题是每个返回的对象是否具有 param 属性。

In [17]: a = 1

In [18]: type(a)
Out[18]: int

In [19]: b = 'b'

In [20]: type(b)
Out[20]: str

In [21]: c = True

In [22]: type(c)
Out[22]: bool

如果您查看上面的示例,您会发现它们是 strintbool 类型的对象。问题是其中 none 个具有 param 属性。

这可能主要是一个基于意见的问题,但我会尝试回答。

无论使用哪种语言,好的变量名总是有帮助的。如果您有一个名称为 get_data 的函数,您无法真正推断出该数据是单个对象还是列表或其他什么。但是如果你有一个 class Bunny 和一些名称为 get_bunnies 的函数,可以安全地假设它将 return 某种集合。当然,总会有一个问题,例如集合是 list 还是 dict

但是如果你只是阅读这样的代码,你可以快速推断出如果它与关键字一起使用,它是一个dict,或者它的一些衍生物。

Duck Typing的目的简而言之就是"if it walks like a duck, swims like a duck and quacks like a duck, then it probably is a duck"。这意味着即使 get_bunnies return 是 dict 的一些奇特的子类,你也应该能够像它实际上是一个 dict 一样使用它,只要它实现了对 __dunder__-methods.

当然,鸭子类型总是会带来一些强类型不会出现的问题,但这通常只是一个约定俗成的问题。如果您不确定某些功能会 return,您可以随时测试它:在您的代码中,在解释器中,甚至查找源代码。

关于 "hungarian notation" 命名变量如 strNamename_string... 我一直同意 Robert C. Martin 的观点,它给变量名带来了不必要的冗余。当然,动态类型的冗余并没有那么糟糕,但即便如此,我还是不喜欢它。在阅读代码和搜索代码时,它往往只会让事情变得更难。或者更甚者,当变量类型改变而不改变名称时...

如果你既没有可用的示例代码也没有好的命名,你将需要查找源代码,或者希望函数定义中包含一个文档字符串。如果你运气好并且文档字符串被定义为 并且是最新的 ,一个好的 IDE 将帮助你为你解析该字符串,甚至是整个定义功能,无需自己寻找源文件。