当 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
如果您查看上面的示例,您会发现它们是 str
、int
和 bool
类型的对象。问题是其中 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" 命名变量如 strName
或 name_string
... 我一直同意 Robert C. Martin 的观点,它给变量名带来了不必要的冗余。当然,动态类型的冗余并没有那么糟糕,但即便如此,我还是不喜欢它。在阅读代码和搜索代码时,它往往只会让事情变得更难。或者更甚者,当变量类型改变而不改变名称时...
如果你既没有可用的示例代码也没有好的命名,你将需要查找源代码,或者希望函数定义中包含一个文档字符串。如果你运气好并且文档字符串被定义为 并且是最新的 ,一个好的 IDE 将帮助你为你解析该字符串,甚至是整个定义功能,无需自己寻找源文件。
例如,如果我正在阅读一些这样工作的代码:
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
如果您查看上面的示例,您会发现它们是 str
、int
和 bool
类型的对象。问题是其中 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" 命名变量如 strName
或 name_string
... 我一直同意 Robert C. Martin 的观点,它给变量名带来了不必要的冗余。当然,动态类型的冗余并没有那么糟糕,但即便如此,我还是不喜欢它。在阅读代码和搜索代码时,它往往只会让事情变得更难。或者更甚者,当变量类型改变而不改变名称时...
如果你既没有可用的示例代码也没有好的命名,你将需要查找源代码,或者希望函数定义中包含一个文档字符串。如果你运气好并且文档字符串被定义为 并且是最新的 ,一个好的 IDE 将帮助你为你解析该字符串,甚至是整个定义功能,无需自己寻找源文件。