You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为函数参数添加类型提示以表明其不应被修改?

解决可变参数只读提示的几种方法

目前Python标准库没有直接提供ReadOnly[list]这类原生类型提示,但可以通过以下几种方式给方法实现者明确传递“禁止修改参数”的要求:

  • 用只读抽象类型替代具体可变类型
    把参数类型从list替换为typing.Sequence,从set替换为typing.AbstractSet。这两个都是只读的抽象基类,它们的接口仅包含读取操作(比如__getitem__、__len__),没有修改方法(比如append、add),能从类型层面暗示实现者不要修改参数。
    修改后的代码示例:

    from abc import ABCMeta, abstractmethod
    from typing import Sequence, AbstractSet
    
    class AbstractClass(metaclass=ABCMeta):
        @abstractmethod
        def abstract_method(self, mutable_parameter: Sequence | AbstractSet):
            raise NotImplementedError
    
  • 添加明确的注释和文档字符串
    如果必须保留原类型(比如需要依赖list/set的特定特性),可以在参数注释或方法文档里直接说明禁止修改:

    from abc import ABCMeta, abstractmethod
    
    class AbstractClass(metaclass=ABCMeta):
        @abstractmethod
        def abstract_method(self, mutable_parameter: list | set):
            """
            抽象方法示例
            
            Args:
                mutable_parameter: 传入的列表或集合,**禁止在实现中修改该参数**
            """
            raise NotImplementedError
    

    也可以定义类型别名强化提示:

    from abc import ABCMeta, abstractmethod
    from typing import TypeAlias
    
    # 仅用于提示“只读”的类型别名
    ReadOnlyList: TypeAlias = list
    ReadOnlySet: TypeAlias = set
    
    class AbstractClass(metaclass=ABCMeta):
        @abstractmethod
        def abstract_method(self, mutable_parameter: ReadOnlyList | ReadOnlySet):
            # 注释再次强调
            # 注意:mutable_parameter是只读的,请勿修改
            raise NotImplementedError
    
  • 运行时强制只读(可选)
    如果需要严格防止参数被修改,可以在抽象方法内部将参数转为不可变容器后再传递(会有一定性能开销,适合要求严格的场景):
    比如将列表转为tuple,集合转为frozenset:

    from abc import ABCMeta, abstractmethod
    
    class AbstractClass(metaclass=ABCMeta):
        @abstractmethod
        def abstract_method(self, mutable_parameter: list | set):
            # 转为不可变类型后再给实现逻辑使用
            readonly_param = tuple(mutable_parameter) if isinstance(mutable_parameter, list) else frozenset(mutable_parameter)
            self._handle_readonly_param(readonly_param)
            raise NotImplementedError
    
        def _handle_readonly_param(self, readonly_param: tuple | frozenset):
            # 子类重写此方法处理只读参数
            pass
    

另外你提到的Final确实不适合参数标注——它的作用是标记变量不可重新赋值,而非限制参数内容的修改,所以PyCharm的提示是正确的。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:15:25