寻找Python功能设计的一些风格说明。
我理解Python是"通过值传递引用"在它的函数调用语义中,但是我仍然经常看到代码,其中人们已经返回了他们在函数内完成的可变对象。一个简单的例子:
def example(pandasDataframe):
pandasDataframe['New Col'] = pandasDataframe['Current Col'] + 'Foo'
return pandasDataframe
然后使用这个函数
df = example(df)
对我来说,这是浪费时间,因为返回语句和调用中的赋值都不是必需的(对于可变对象)。然而,这是一个非常常见的习语(特别是在熊猫代码中)
在使用Python编码时,这是一个公认的/正式的约定吗?
我想知道这是否被视为值得称赞的防御性编程,或者至少在某些时候某些程序员缺乏理解?
任何人都可以澄清任何正式规则,或者这是留给开发人员的个人品味/意见吗?
答案 0 :(得分:2)
在您的情况下,您可以将DataFrame方法直接应用于example
函数的结果。 E.g。
mean_val = example(DataFrame.from_dict(some_dict)).applymap(some_func)["some_field"].mean()
没有链接你需要写这样的东西:
tmp_fame = DataFrame.from_dict(some_dict)
example(tmp_frame)
tmp_frame = tmp_frame.applymap(some_func)
tmp_slice = tmp_frame["some_field"]
mean_val = tmp_slice.mean()
答案 1 :(得分:0)
我的2美分:
首先, Python 更容易被认为是按对象传递。这些语句背后的原因(按值传递,通过引用传递等)是因为上下文假设是C / Java作为定义我们都同意的东西的方式根据。但是当一些新的东西出现时无法通过当前的惯例或概念来定义时,就产生了这种争论。
我的回答可以追溯到依赖于背景以及如何使用人们开发软件的设计和编程范例和假设。
功能编程(纯函数)回答其中一些问题。面向对象允许Python具有可变性(并且与您的问题直接相关)。
Python 允许使用许多范例,并提供了很多功能(应该明智地使用),这就是Python依赖于许多约定的原因。
我想说返回一个值(例如在你的情况下)是一个很好的方法,因为它清晰,明确且易于维护和重构( Explicit比隐式更好。; 如果实施难以解释,那就不错了。)