python禁止位置传参函数详解
作者:Covirtue
文章介绍了Python3.x中的关键字参数特性,说明了如何在函数定义中使用*符号来限制参数只能通过关键字传递,而不是位置,这种特性在处理参数较多或顺序可能导致混淆的函数时特别有用,提高了代码的可读性和健壮性
python禁止位置传参函数
这种函数定义方式使用了 Python 3.x 中的关键字参数(keyword-only arguments)的特性,通过在参数列表中使用 *
符号作为分隔符,来明确指示该函数之后的参数必须使用关键字(即参数名)来传递,而不能通过位置(即按顺序)来传递。
在函数定义中:
def init( *, args: List[str] | None = None, context: Context = None, domain_id: int | None = None, signal_handler_options: SignalHandlerOptions | None = None ) -> None
所有的参数(args
, context
, domain_id
, signal_handler_options
)都是关键字参数,这意味着在调用这个函数时,必须显式地使用参数名来指定每个参数的值,而不能仅仅通过位置来传递它们。
例如:
# 正确的调用方式 init(args=["some", "args"], context=some_context, domain_id=123, signal_handler_options=options) # 错误的调用方式(会引发TypeError) init(["some", "args"], some_context, 123, options)
在第二种调用方式中,因为没有使用参数名,Python 解释器无法将提供的值正确地映射到函数的参数上,因此会抛出一个 TypeError
。
这种设计在函数需要很多参数,或者参数的顺序可能会让调用者混淆时特别有用。
它增加了代码的可读性和健壮性,因为调用者必须清楚地指明每个参数的值。
python传参时避免参数改变
import os import collections import math import sys # 我们知道,用python写递归,在进行传参时,不像C++,参数的传递是值传递的时候,并不改变参数实际的值;只有使用引用传递时,才会改变参数, # 但是在Python中,参数的传递是分为可变类型和不可变类型的,比如list就是可变类型,tuple就是不可变类型,下面就介绍一下两种方法来避免参数的改变。 # 第一种就是使用如下面v[:]来对list进行操作 """ def main(v, cnt): if cnt == 5: v.append(cnt) print(v) return v.append(cnt) main(v[:], cnt+1) print(v) return """ """ v = [1, 2, 3] main(v[:], 4) """ # 第二种就是传参数的时候使用tuple,在函数里面,把tuple变为list,可进行修改。 """def main(v, cnt): if cnt == 5: tmp = list(v) tmp.append(cnt) print(tmp) return tmp=list(v) tmp.append(cnt) main(tuple(tmp), cnt+1) print(tmp) return v=[1,2,3] main(tuple(v),4)"""
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。