区分只读函数输入参数和可变参数的python方式



Python似乎没有有效的const限定符,我如何在Python中创建常量?什么是最"python"的?区分只读/可变函数参数的方式?我应该在评论里指出来吗?

# my_graph is READ-ONLY
# my_set is added items with property X ...
def my_lovely_function(my_graph,my_set):

在C和其他几种语言中,通常通过指针或引用传递的输入来传递实际输出。这样做的原因是,许多范例中的返回值机制已经被用于错误处理目的,即返回值是成功/错误代码,而有用的输出则填充在输入/指针引用中。这导致需要将一些输入表示为不可触摸的(const),而将其他输入表示为可触摸的,以防止在使用函数时混淆。

Python通常不希望你这样做。它希望您对错误处理使用exception和异常处理,并对实际输出使用return语句。这更清晰,更符合返回值被错误处理劫持之前的原始思想。

在某些情况下,使用可变输入来传输数据仍然更方便。python中的一切都是通过引用来实现的。这是可以的,除非调用上下文不希望你(函数)修改它作为输入提供的变量。

Python的解决方案是1)期望函数编写者正确地记录可变输入的输入、输出和副作用,2)为调用上下文提供传入不可变对象的选项,如果他们想确保这些对象不会被更改。

所以,如果你有一个列表,你不希望调用一些函数来添加或减去它的东西,传递信息作为一个元组代替。任何函数都不能在元组中添加或减去任何东西,但是,如果元组中的元素是可变的,它们可能能够更改这些元素。传递一个frozenset而不是set。没有不可变的字典类型,但您可以通过传递副本或将其转换为元组的冻结集来解决这个问题。字符串、整型、浮点数和复数都是不可变的。请注意,嵌入在不可变容器中的可变对象仍然可以被更改。如果不希望这样,那么请确保它们是不可变的。或者,如果你是偏执狂,你可以在一个对象上调用copy.deepcopy()来创建一个完全独立的副本(递归地)传递给函数。在此深度拷贝的任何嵌套级别上的任何更改都不会影响原始对象。

在编写函数时,应该从文档(最好是docstring)或代码本身清楚地了解可变对象的返回值和副作用。在编写函数时使用文档字符串来捕获这些信息是最佳实践。

调用函数时,应该根据具体情况使用不可变类型(或深度复制)。

相关内容

  • 没有找到相关文章

最新更新