首页 > 编程问答 >指示参数应该是可变引用

指示参数应该是可变引用

时间:2024-07-31 07:33:34浏览次数:9  
标签:python python-typing

使用 PEP 484 和 585 中指定的类型提示语法,是否有任何方法可以指示函数的参数应该是由函数修改的可变引用?

例如,C# 有 ref 参数,因此在Python,有等效的吗?例如

>>> def foo(spam: "Mutable[List[int]]"):
...     spam.append(sum(spam))
...
>>> a = [1, 2, 3]
>>> foo(a)
>>> a
[1, 2, 3, 6]

或者如果不是,我如何定义这样的类型而不导致检查逻辑认为它是一个特殊的 Mutable 类而不是 List[int] ?显然,这将用作开发人员更容易理解方法的工具,而不是用于从根本上更改程序的工具。

为了清楚起见,我知道列表的定义是可变的,但我例如,我想知道是否有办法定义 何时 它会发生突变

>>> def bar(sandwich: Mutable[List[str]], fridge: List[str]):
...     sandwich.extend(random.sample(fridge, k=3))

不,Python 中没有办法用类型提示来指示函数参数应该是由函数修改的可变引用。

在 Python 中,列表等参数是通过赋值传递的。但是,重要的是要理解这不是按值传递,而是按对象引用传递。

这意味着当你将一个列表传递给一个函数时,函数会收到对原始列表对象的引用。如果函数修改了列表,修改将在原始列表对象上进行。然而,如果函数将新值赋给参数名称本身,则只会影响函数的局部作用域。

在你的示例中,函数 foo 确实修改了原始列表 a 。这是因为 append 方法修改了列表对象本身。

类型提示 List[int] 已经表明参数应该是一个整数列表。没有办法进一步指定列表应该由函数修改。

Mutable 的概念在类型提示中不存在,因为 Python 中的可变性与变量本身无关,而与变量引用的对象的类型有关。

定义函数意图(包括哪些参数可能被修改)的最佳方法是使用文档字符串。

例如:

def bar(sandwich: list[str], fridge: list[str]) -> None:
    """从冰箱中随机选择 3 个项目,并将它们添加到三明治中。

    Args:
        sandwich: 将添加项目的列表。
        fridge: 可选项目的列表。
    """
    sandwich.extend(random.sample(fridge, k=3))

这种方法使得开发人员能够清楚地理解 sandwich 列表的预期用法和修改。

标签:python,python-typing
From: 59644703

相关文章

  • 激活虚拟环境会让python消失?
    VisualStudioCode终端的屏幕截图如屏幕截图所示,python在Powershell中运行得很好。然后我在E:\DrewFTCAPI\ftcapivenv激活虚拟环境,然后python就消失了。不仅没有消失,它不运行任何东西,也不产生任何输出。我至少预计会出现某种类型的"python"i......
  • Python 3.6 中的相互递归类型,使用命名元组语法
    我正在尝试实现图的节点和边。这是我的代码:fromtypingimportNamedTuple,ListclassNode(NamedTuple):name:stredges:List[Edge]classEdge(NamedTuple):src:Nodedest:Node这会引发错误,因为创建Edge时未定义Node类型。......
  • 使用 keras 模型对函数进行 Python 类型提示
    如果我创建这样的函数:defmdl(input_shape):model=Sequential()model.add(Conv2D(depth=64,kernel_size=(3,3),input_shape=input_shape,activation='relu'))model.add(Dense(32),activation='relu')model.add(Dropout(0.3))m......
  • Python:自动完成可以用于列表中的元素吗?
    Python在函数参数和函数返回类型中具有类型提示。类的元素是否有类似的东西?我希望能够在如下示例中使用自动完成功能:classMyClass:defhello(self):print("Hello")mylist=[]mylist.append(MyClass())foriinmylist:i.hello()#Noautocomplete......
  • python 中 COM 对象的正确类型提示是什么?
    我在python中使用COM对象来向3rd方软件公开可编程接口。这是通过使用Dispatchfromwin32com.client来实现的。我的项目也一直在使用python.3.7中的类型提示,但是我不确定如何为了类型提示的目的定义这些COM对象的类型。这个问题涉及我拥有的所有COM......
  • 如何遍历Python字典同时避免KeyErrors?
    解析大型JSON时,某些键可能仅在某些情况下存在,例如出现错误时。从服务器的API获取200OK的情况并不少见,但是您得到的响应包含应检查的错误。处理此问题的最佳方法是什么?我知道使用类似||之类的东西。|是处理KeyError的一种方法。get()但是如果......
  • Python 中的递归数据类型
    Python中最接近Haskell中的递归数据类型的是什么?(即在定义自身时使用类型自己的定义。)编辑:为了给出递归类型的更具体定义,下面是Haskell中的二叉树:dataTreea=Leafa|Branch(Treea)(Treea)我的阅读方式如下:二叉树可以是叶子,也可以包含两......
  • 如何在Python中平滑相邻的多边形?
    我正在寻找一种平滑多边形的方法,以便相邻/接触的多边形保持接触。单个多边形可以轻松平滑,例如使用PAEK或Bezier插值(https://pro.arcgis.com/en/pro-app/latest/tool-reference/cartography/smooth-polygon.htm),这自然会改变它们的边界边缘。但是如何平滑所有多边形......
  • Python多处理池不启动多个进程
    我正在尝试使用多处理池来创建多个进程。我有一个工作函数dummy_proc定义如下:importrefrommultiprocessingimportPooldefregex_check(input_string):#Patterntomatchboth"pm_lat"and"pm_lon_coslat"followedbytwofloatspattern=r"(c......
  • 迟滞建模作为 Python GEKKO 中 MPC 的控制约束
    我试图使用PythonGEKKO在用于控制信号调度的MPC优化问题中引入滞后约束。这已成为一项艰巨的任务,因为我无法将以下问题转换为GEKKO理解的方程。问题:如果开启时间<最短开启时间,则给定资产的控制调度不应将其关闭。如果关闭时间<最小关闭时间......