【问题标题】:Pythonic way for static function variables (small scope, single initialization)?静态函数变量的 Pythonic 方式(小范围,单一初始化)?
【发布时间】:2017-10-24 10:30:36
【问题描述】:
def clean_word(word):
    chars_to_clean = {',', ':', '.','/'} #static?
    res = ''
    for c in word:
        if c not in chars_to_clean:
            res += c
    return res

在 C++ 中,我会将chars_to_clean 声明为static,这样一方面我可以最小化它的范围,另一方面避免重复赋值。如何在 Python 中实现这些目标?

我可以将chars_to_clean 设为类变量,但我想尽可能缩小范围。
我可以将其设为函数的属性,但我怀疑每次调用都会重复分配。

【问题讨论】:

  • 你可以在变量名前加一个__,这将强制python破坏它。
  • @cᴏʟᴅsᴘᴇᴇᴅ 谢谢,我认为它值得一个完整的答案,特别是如果你解释混合:)

标签: python python-3.x static


【解决方案1】:

你不必

你发布的代码很好(范围很小,创建这么小的集合不需要足够的时间来打扰它。

但是,如果您想更改代码,这里有一个建议:

将其设为默认参数

如果您希望避免重复创建 chars_to_clean 集,您可以执行以下操作(请参阅 "Least Astonishment" and the Mutable Default Argument):

def clean_word(word, chars_to_clean = {',', ':', '.','/'})
    res = ''
    for c in word:
        if c not in chars_to_clean:
            res += c
    return res

这样该集合只被创建一次(当 python 读取函数定义时),您可以重用该函数来清理不同的字符。这是危险的,如果你(意外地)改变了集合,你无论如何都不会在这里做。

大写

如果你想明确(按照惯例)这个变量是一个常量,把变量名全部改成大写,不要关心范围

把它变成一个字符串

你可以在 python 中做"a" in "abcde"。通过将其从集合更改为字符串,您可以使其不可变。 (但仍然可以重新分配)

使它成为一个没有 setter 的类属性

如果您想避免意外重新分配/修改,请将其设为不带 setter 的类属性。然而,这种解决方案可能有点过头了。

class A:
    @property
    def chars_to_clean(self):
        return ",:./"

在这种情况下,您仍然可以使用A.chars_to_clean = "abc",但A().chars_to_clean="asd"A().chars_to_clean[0]=w 会引发错误,第一个是由于缺少setter,第二个是由于字符串的不变性。

【讨论】:

  • 非常感谢,有这么多好建议!重新“不必”,我想你是对的,但是对于许多文本文件中的每个单词都会调用这个函数,所以我想把它保存在明显的地方,即使它有点为时过早优化。
【解决方案2】:

函数是一个对象,因此您可以在对象上设置属性并使用它们。它们不是“私有的”,但在阅读代码时您会发现它们密切相关。

类似的东西:

def clean_word(word):
    res = ''
    for c in word:
        if c not in clean_word.chars_to_clean:
            res += c
    return res

clean_word.chars_to_clean = {',', ':', '.','/'} 

这不是很优雅,因为你必须在定义函数之后定义 chars_to_clean

另一个选项,您可以在定义函数时定义属性,但检查 hasattr 也不是很好:

def clean_word(word):
    if not hasattr(clean_word, 'chars_to_clean'):
        clean_word.chars_to_clean = {',', ':', '.','/'}     
    res = ''
    for c in word:
        if c not in clean_word.chars_to_clean:
            res += c
    return res

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2010-12-22
    相关资源
    最近更新 更多