在下面的函数定义中,*/说明了什么?

def func(self, param1, param2, /, param3, *, param4, param5):
     print(param1, param2, param3, param4, param5)

NOTE: Not to mistake with the single|double asterisks in *args | **kwargs (100)

推荐答案

有一个new function parameter syntax /指示某些函数参数必须按位置指定,不能用作关键字参数.[103]

文档详细说明了positional-only parameters的一些用例/优点

  1. 它允许纯Python函数完全模拟

    def pow(x, y, z=None, /):
        "Emulate the built in pow() function"
        r = x ** y
        return r if z is None else r%z
    
  2. 另一个用例是当参数

    len(obj='hello')  # The "obj" keyw或d argument impairs readability
    
  3. 将参数标记为仅位置参数的另一个好处是

    def quantiles(dist, /, *, n=4, method='exclusive')
        ...
    

其中as *用于强制caller to use named arguments.This is命名参数的用例之一.

因此,根据这种方法,

def func(self, param1, param2, /, param3, *, param4, param5):
     print(param1, param2, param3, param4, param5)

它一定是打电话来的

obj.func(10, 20, 30, param4=50, param5=60)

obj.func(10, 20, param3=30, param4=50, param5=60)

比如,

  1. param1, param2 must be specified positionally.
  2. param3 can be called either with positionalkeyw或d.
  3. param4 and param5 must be called with keyw或d argument.

演示:

>>> class MyClass(object):
...     def func(self, param1, param2, /, param3, *, param4, param5):
...         return param1, param2, param3, param4, param5
...
>>> obj = MyClass()
>>>
>>> assert obj.func(10, 20, 30, param4=40, param5=50), obj.func(
...     10, 20, param3=30, param4=40, param5=50
... )

Python-3.x相关问答推荐

DuckDB:带有嵌套对象的星形表达式

如何使用regex将电话号码和姓名从文本字符串中分离出来

根据另一列中的条件填写该列中的值

无法使用Python发送带有参数和标头的POST请求

visual studio代码窗口中未激活虚拟环境11

将自定义函数应用于 pandas 数据框的每一列

无法理解此递归函数的分配和环境用法

在 Python 中实现 COM 接口

为直方图中的每个 bin 绘制不同的 colored颜色 (Matplotlib)

如何使用pandas python获取数据框中每列的最大长度

逗号分隔列表的 argparse 操作或类型

具有两个或多个返回参数的函数注释

如何用pymongo连接远程mongodb

如何模拟 open(...).write() 而不会出现没有这样的文件或目录错误?

使用 urllib3 忽略证书验证

如何为 Python 3.x 安装 psycopg2?

为什么异步库比这个 I/O 绑定操作的线程慢?

python asyncio add_done_callback 与 async def

__iter__ 和 __getitem__ 有什么区别?

Python 无法处理以 0 开头的数字字符串.为什么?