Python 函数封装(避免在没有适当上下文的情况下意外调用)

Python Function Encapsulation (to avoid accidental invocations without proper context)

我正在拼凑一个小型的内部应用程序,以 "bottom-up" 的方式从我的脑海中倾倒它。

因此,一旦我发现我正在编写的函数有效,我想将它变成一个 "helper" 函数,并防止自己在一小时或一年后回来编写代码以我不打算调用它的方式调用它。

在 Java 中,我可以创建一个 class,将我的 "helper" 函数设为私有静态方法,然后将我 "mean to" 调用它们的代码放入一个public 静态方法。

避免像我描述的那样踩到自己的脚趾的 pythonic 方法是什么?

这是一个非常简单的示例函数,我不想让自己从 "just anywhere":

调用

(例如,也许为了可编辑性,我想将所有需要 "simple_salesforce" 模块的函数放在一起,但不想将 getAFreshContactList() 之类的函数暴露给调用在控制登录流程的异常处理代码之外,确定是否甚至需要新的联系人列表、注销等)

from simple_salesforce import Salesforce
def getAFreshContactList(sfSession):
    if isinstance(sfSession, Salesforce):
        return sfSession.query("SELECT Id, Name, Email FROM Contact LIMIT 2")['records']

谢谢!

将函数添加到单独的帮助程序模块。不要使用 * 符号导入模块,函数调用约定的行为将与 Java 静态函数的行为完全相同。例如:

my_helper.py:

from simple_salesforce import Salesforce
def getAFreshContactList(sfSession):
    if isinstance(sfSession, Salesforce):
        return sfSession.query("SELECT Id, Name, Email FROM Contact LIMIT 2")['records']

my_program.py

import my_helper
def someFunction:
    my_helper.getAFreshContactList(None)

实际上 Python namespaces 的全部要点就是在服务于不同目的的名称之间创建分隔。

虽然 python 约定 允许您在模块属性前加上下划线以防止它出现在文档和星形导入中,there is no such thing as truly private in Python:

“Private” instance variables that cannot be accessed except from inside an object don’t exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.

在 Java 中,您必须使用反射来调用 class 的私有声明方法,但在 Python 中,没有任何东西可以阻止您调用 my_helper._myPrivateFunction() 直接在惯例之外。在函数或任何其他属性前加上下划线应该只是用来提醒您在模块外使用它时要格外小心。