Python 中的 Pythonic 用法或下划线(私有)名称

Posted

技术标签:

【中文标题】Python 中的 Pythonic 用法或下划线(私有)名称【英文标题】:Pythonic usage or underscore (private) names in Python 【发布时间】:2021-10-07 15:34:29 【问题描述】:

我想知道在模块、类和方法中使用 _ 来编写 Python 代码更符合 Python 风格。

示例 1:

import threading as _threading

class Thread(_threading.Thread):
    pass

from threading import Thread

class MyThread(Thread):
    pass

在模块级别上,在这样的方法中引入私有变量是否有意义:

def my_module_method():
    _throw = foo + bar
    return _throw

def my_module_method():
    throw = foo + bar
    return throw

我是否正确假设私有名称的最佳用法是防止类的实例使用某些私有临时方法,例如:

class MyClass(object):
    _my_internal = 0
    def _do_not_use_me()
        pass

以便该类的最终用户知道不要直接在以下位置使用这些方法:

foo = MyClass._do_not_use_me()
bar = MyClass._my_internal

非常感谢您对私人名称的一般用法提出任何其他建议。

【问题讨论】:

这可能是基于意见的,因此不适合 SO。但是恕我直言,您的假设是正确的。至于函数中的“私有”变量——这是没有意义的,因为无论如何它们都不能从外部访问。 “私人”导入也没有意义,因为它们只会在import * 中被忽略,这无论如何都是一种不好的做法。所以对我来说,只有类属性、对象属性、方法和(未导入的)类和函数应该是“私有的”。 【参考方案1】:

请记住,对于 Python,没有什么是“硬规则”更多的约定。除了一些例外,只要你保持一致并且你的代码易于理解,在你的变量前面加上你想要的任何东西都没有错。

但是,如果您想遵循通用约定,请继续阅读。

一般

由于 Python 没有像其他一些语言那样的访问修饰符(访问修饰符,如 privatepublicprotected 等),_ 前缀标记了类中不存在的字段、方法等可以被外部访问。它标志着私人使用。

考虑到这一点,让我们一一看你的例子:

示例 1

首选方式是:

from threading import Thread

class MyThread(Thread):
    pass

你也可以使用:

import threading

class MyThread(threading.Thread):
    pass

但你不应该在 _ 前缀导入的模块。

示例 2

一般情况下,你无法访问函数的内部变量。因此,没有理由使用_。因此这是这样的:

def my_module_method():
    throw = foo + bar
    return throw

我能想到的唯一例外是嵌套函数,您可以在其中复制名称并避免歧义,您可以使用 _ 来区分变量:

def my_outer_method():
    throw = foo + bar

    def my_inner_method(_throw):
        return _throw * 2
    
    return my_inner_method(throw)

示例 3

是的,这就是您使用 _ 前缀的确切原因。

my_class = MyClass()
foo = my_class._do_not_use_me()
bar = my_class._my_internal

这告诉类的使用者他们正在做他们不应该做的事情或不安全的事情。

【讨论】:

以上是关于Python 中的 Pythonic 用法或下划线(私有)名称的主要内容,如果未能解决你的问题,请参考以下文章

浅谈python 字典对象的 Pythonic 用法

字典对象的 Pythonic 用法(上篇)

是否有标准的pythonic方法来处理python中的物理单位/数量?

python中re库的常见用法

如何让你的Python代码更加pythonic ?

Python中的下划线(转)