例如,如果我正在阅读一些像这样工作的代码:
list_of_objects = function_returning_object_list()
for object in list_of_objects:
do_something(object.param)
如果您只是阅读代码并且不知道 function_returning_object_list()
实际上确实返回一个列表,那么 object.get_param
是不是有点奇怪的物体?如果没有变量类型,您如何通过命名约定来避免这种困惑?
希望我说得清楚。
最佳答案
这可能主要是一个基于意见的问题,但我会尝试回答。
无论使用哪种语言,好的变量名总是有帮助的。如果您有一个带有名称的函数,例如 get_data
,您无法真正推断出该数据是单个对象还是列表或其他什么。但是,如果您有一个 class Bunny
和一些名为 get_bunnies
的函数,则可以安全地假设它将返回某种集合。当然,总是存在一个问题,例如集合是 list
还是 dict
。
但是如果你只是阅读这样的代码,你可以很快推断出如果它与关键字一起使用,它是一个dict
,或者它的某种派生。
Duck Typing的目的简而言之,“如果它像鸭子一样走路,像鸭子一样游泳,像鸭子一样嘎嘎叫,那么它可能就是一只鸭子”。这意味着即使 get_bunnies
返回 dict
的一些奇特子类,您也应该能够像使用它实际上是 dict
一样使用它,只要因为它实现了正确的 __dunder__
-方法。
鸭子类型当然总是会带来一些强类型不会带来的问题,但这通常只是一个约定问题。如果您不确定某个函数将返回什么,您可以随时测试它:在您的代码中、在解释器中甚至查找源代码。
关于命名变量的“匈牙利表示法”,如 strName
或 name_string
...我一直同意 Robert C. Martin 的观点,即它给变量名带来了不必要的冗余。当然,动态类型的冗余并没有那么糟糕,但即便如此,我也不喜欢它。当阅读代码和搜索代码时,它往往会让事情变得更加困难。甚至更重要的是,当变量类型更改而不更改名称时......
如果您既没有可用的示例代码也没有良好的命名,您将需要查找源代码,或者希望函数定义中包含文档字符串。如果您很幸运并且文档字符串已定义并且是最新的,那么一个好的 IDE 将帮助您解析该字符串,甚至是函数的整个定义,而无需查找源文件自己看。
关于python - 当编写/阅读 python 代码时,人们如何判断变量是否是对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41179087/