2016-12-16 69 views
1

例如,如果我读一些代码,是这样的:在编写/读取python代码时,人们如何判断一个变量是否是一个对象?

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

不是object.get_param种奇怪地看到,如果你只是阅读的代码,不知道function_returning_object_list()实际执行返回对象列表?没有可变类型的输入,你如何通过命名约定来避免这种混淆?

希望我很清楚。

+1

您可以随时检查它的类型,例如,用'type()'。但总的来说,一个对象的类型应该在写得很好的代码中非常清晰,并且通常会被函数名称隐含。 – Natecat

回答

3

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

良好的变量名称总是帮助不管语言。如果你有一个名字的函数,比如get_data,那么如果这个数据是一个单独的对象或者一个列表或者什么的话,那么你就不能真正推断出这个数据。但是,如果您有class Bunny和某个名称为get_bunnies的函数,则可以安全地假设它会返回某种集合。当然总是存在一个问题,例如收集是否为listdict

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

Duck Typing的用途简而言之就是“如果它像鸭子一样走路,像鸭子一样游泳,像鸭子一样跳,,那么它可能是一只鸭子。这意味着,即使get_bunnies回报dict一些奇特的子类,你应该能够使用它像它实际上是一个dict,只要它实现了正确的__dunder__ - 方法。

鸭打字总是当然引发了一些问题,强类型不对,但通常只是一个约定的事情。如果您不确定某个函数会返回什么,您可以随时对其进行测试:在代码中,在解释器中甚至查找源代码。

关于命名变量的“匈牙利符号”,如strNamename_string ......我一直同意罗伯特·C·马丁的观点,认为它给变量名带来不必要的冗余。当然,对于动态输入来说,冗余并不是那么糟糕,但即便如此,我也不喜欢它。在阅读代码并搜索代码时,它往往会让事情变得更加困难。或者甚至更多,当变量类型改变而不改变名称时...

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

+0

这是我正在寻找的答案,或多或少。谢谢。 – frei

0

那么,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类型,intbool的对象。问题是这些都没有param属性。

+0

我想我在想什么是否象征性地引用一个对象的类型是一个好主意或不是。例如,如何区分'wow_string = str('wow')'或'wow_string = CustomStringClass('wow')',或者这些是否是好符号。 – frei

+0

您可以使用'isinstance'来检查对象所属的这两个类中的哪一个。 – Fejs

+0

如果这是您的问题,匈牙利语符号被认为是非常和谐的。 –

相关问题