根据如何在 Python 中创建常量? Python 似乎没有有效的const
限定符?区分只读/可变函数参数的最“pythonic”方式是什么?我应该在评论中指出吗?
# my_graph is READ-ONLY
# my_set is added items with property X ...
def my_lovely_function(my_graph,my_set):
根据如何在 Python 中创建常量? Python 似乎没有有效的const
限定符?区分只读/可变函数参数的最“pythonic”方式是什么?我应该在评论中指出吗?
# my_graph is READ-ONLY
# my_set is added items with property X ...
def my_lovely_function(my_graph,my_set):
在 C 和其他几种语言中,实际输出通常通过指针或引用传递的输入进行通信。其原因是许多这些范例中的返回值机制已被劫持用于错误处理目的,即返回值是成功/错误代码,而有用的输出填充在输入/指针引用中。这导致需要将一些输入表示为不可触摸(consts),而将其他输入表示为可触摸,以防止在使用该函数时出现混淆。
Python 通常不希望你那样做。它希望您使用异常和异常处理来进行错误处理,并将返回语句用于实际输出。这更简洁,更符合返回值被错误处理劫持之前的原始想法。
在某些情况下,使用可变输入将数据传出会更方便。python 中的所有内容始终是通过引用。这很好,除非调用上下文不希望您(该函数)修改它作为输入提供的变量。
Python 的解决方案是 1) 期望函数编写器正确记录可变输入的输入、输出和副作用,以及 2) 为调用上下文提供传入不可变对象的选项,如果他们想确保这些对象不会被更改.
因此,如果您有一个列表并且您不希望调用某些函数来从中添加或减去某些内容,请改为将信息作为元组传递。任何函数都不能向元组添加或减去任何内容,但是如果这些元素是可变的,它们可能能够更改元组的元素。而不是一个集合,传递一个frozenset。没有不可变的 dict 类型,但您可以通过传递一个副本或将其转换为一组冻结的元组来解决这个问题。字符串、整数、浮点数和复数都是不可变的。请注意,嵌入在不可变容器中的可变对象仍然可以更改。如果这是不希望的,请确保它们是不可变的。或者,如果您偏执,您可以在对象上调用 copy.deepcopy() 以制作完全独立的副本(递归)以传递给函数。
在编写函数时,应该从文档(最好是 docstring)或代码本身中清楚地了解可变对象的返回值和副作用是什么。在编写函数时使用文档字符串来捕获这一点是最佳实践。
当调用一个函数时,你应该根据你的具体情况,防御性地使用不可变类型(或者如果需要的话,深度复制)。