在 python 模块中使用像下划线这样的访问修饰符控制应该如何访问定义的变量或导入的模块、函数、class?

use of access modifier like underscore in python module control how variable defined or module, function, class imported should be accessed?

Python 没有任何有效限制对任何实例变量或方法的访问的机制。 Python 规定了在 variable/method 的名称前加上单下划线或双下划线的约定,以模拟受保护和私有访问说明符的行为。

class Employee(object):
    def __init__(self, name, sal):
        self._name=name  # protected attribute 
        self._salary=sal # protected attribute

虽然这种机制用于面向对象编程,但我的问题是我们能否使用这种方法向其他开发人员传达我希望如何访问我的 python 模块中的变量或导入模块。

在我很久以前工作的一家公司里,如果我们想告诉开发人员我不希望我在这里导入的这个变量或模块是从此模块外部访问。

如果它是告诉我如何定义变量或模块或函数的访问的方式,或者 class 我从其他地方导入到我的模块中。它记录在某处吗? (比如 ieee.org)

**some_module.py**

from some_module_api import preset as _preset

.
.
.

引用 Python 风格指南 PEP8:

In addition, the following special forms using leading or trailing underscores are recognized (these can generally be combined with any case convention):

_single_leading_underscore: weak "internal use" indicator. E.g. from M import * does not import objects whose names start with an underscore.

single_trailing_underscore_: used by convention to avoid conflicts with Python keyword, e.g.

tkinter.Toplevel(master, class_='ClassName')

__double_leading_underscore: when naming a class attribute, invokes name mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).

__double_leading_and_trailing_underscore__: "magic" objects or attributes that live in user-controlled namespaces. E.g. __init__, __import__ or __file__. Never invent such names; only use them as documented.

您应该遵循这些约定,否则您可能会混淆其他编码人员,或者编写的代码将来可能会出错(比如发明双下划线的“魔术”名称)。

至于将名称导入您的代码,请尊重其他编码人员的提示,除非您有充分的理由不这样做。当使用 as 从导入的名称定义别名时,相同的规则适用于现在是您自己的模块中的名称的别名。