跳到主要内容

Python 一些规范

私有变量和私有函数

Python 中没有禁止访问类中某一成员的保护机制。Java 是一门非常工程化的语言,其哲学就是为工程服务,通过各种限制,尽可能减少程序员编写错误代码的机会。而 Python 则相反,其哲学为信任编码者,给程序员最少的限制,但程序员必须为自己编写的代码负责。

那是否意味着 Python 认为面向对象编程不需要封装呢?答案也是否定的。Python通过编码规范而不是语言机制来完成封装,具体而言,Python 规定了对变量命名的公约,约定什么样的变量名表示变量是私有的,不应该被访问(而不是不能被访问)。

提示

在设计类时,一定要明确类的成员变量和方法是否公开,如果暂不确定,则不公开,因为把一个私有变量修改为公开变量要比把一个公开变量修改为私有变量更简单。

在 Python 中,没有绝对在外部访问不了的变量,但 Python 代码应遵循一个规范:以 单个下划线开头的变量或方法应被视为非公开的 API,因此不用特别声明,外部的调用者也不应该去访问以单下划线开头的变量或方法,因为类的设计者也遵循着这个规范,他会默认外部的调用者不会访问这种变量。

def _convert_messages_to_prompt(self, messages: List[BaseMessage]) -> str:
....

__all__ 的作用

这个 __all__ 也是一种约定俗成的命名方式

  1. 在 Python 中 __all__ 是针对模块公开接口的一种约定,比起双下划线的方式(私有变量或者私有函数), __all__ 以提供了”白名单“的形式暴露接口。
  2. 一些不以下划线开头的变量(比如从其他地方 import 到当前模块的成员)可以同样被排除出去。
  3. 如果定义了 __all__,其他文件中使用 from xxx import * 导入该文件(可以是模块或者包)时,只会导入 __all__ 列出的成员,可以其他成员都被排除在外。

使用时也非常简单,如下:

from langchain.chat_models.anthropic import ChatAnthropic
from langchain.chat_models.azure_openai import AzureChatOpenAI
from langchain.chat_models.fake import FakeListChatModel
from langchain.chat_models.google_palm import ChatGooglePalm
from langchain.chat_models.human import HumanInputChatModel
from langchain.chat_models.jinachat import JinaChat
from langchain.chat_models.openai import ChatOpenAI
from langchain.chat_models.promptlayer_openai import PromptLayerChatOpenAI
from langchain.chat_models.vertexai import ChatVertexAI

__all__ = [
"ChatOpenAI",
"AzureChatOpenAI",
"FakeListChatModel",
"PromptLayerChatOpenAI",
"ChatAnthropic",
"ChatGooglePalm",
"ChatVertexAI",
"JinaChat",
"HumanInputChatModel",
]