区分只读函数输入参数和可变参数的 Pythonic 方法

问题描述

Python 似乎没有有效的 const 限定符 How do I create a constant in Python? 区分只读/可变函数参数的最“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)或代码本身中明确返回值和对可变对象的副作用是什么。在编写函数时使用文档字符串来捕获这一点是最佳实践。

在调用函数时,您应该根据具体情况的需要,防御性地使用不可变类型(或深度复制,如果需要)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...