【问题标题】:Pythonic way to distinguish read-only function input parameters from mutable ones区分只读函数输入参数和可变参数的 Pythonic 方法
【发布时间】:2021-01-14 08:09:30
【问题描述】:

Python 似乎没有一个有效的const 限定符每个How do I create a constant in Python? 区分只读/可变函数参数的最“pythonic”方式是什么?我应该在 cmets 中指出它吗?

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

【问题讨论】:

  • 不在 cmets 中,但可能在文档字符串中。请注意,“只读”参数可以具有可变值,它们只是没有变异。核心 Python 中的约定是将突变作为它们突变的事物的方法,它们返回 None,在本例中为 my_set.my_lovely_method(my_graph)

标签: python constants readonly mutable input-parameters


【解决方案1】:

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

Python 通常不希望您那样做。它希望您使用异常和异常处理来进行错误处理,并将返回语句用于实际输出。这更简洁,更符合返回值被错误处理劫持之前的原始想法。

在某些情况下,使用可变输入将数据传出仍然更方便。 python 中的所有内容总是通过引用。这很好,除非调用上下文不希望您(该函数)修改它作为输入提供的变量。

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

因此,如果您有一个列表并且您不希望调用某些函数来从中添加或减去某些内容,请改为将信息作为元组传递。任何函数都不能向元组添加或减去任何内容,但是如果这些元素是可变的,它们可能能够更改元组的元素。而不是一个集合,传递一个frozenset。没有不可变的 dict 类型,但您可以通过传递一个副本或将其转换为一组冻结的元组来解决这个问题。字符串、整数、浮点数和复数都是不可变的。请注意,嵌入在不可变容器中的可变对象仍然可以更改。如果这是不希望的,请确保它们是不可变的。或者,如果您偏执,您可以在对象上调用 copy.deepcopy() 以制作完全独立的副本(递归)以传递给函数。此深层副本的任何嵌套级别的任何更改都不会影响原始对象。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2020-07-14
    • 2018-06-28
    • 2020-01-03
    • 2015-10-19
    • 2014-12-19
    相关资源
    最近更新 更多