【问题标题】:Is checking if a variable is defined to be avoided in Python?检查是否在 Python 中定义了要避免的变量?
【发布时间】:2019-07-20 12:45:46
【问题描述】:

我经常读到检查变量是否已定义在某种程度上是一个糟糕的设计选择。但我看不出有其他方法可以处理类方法中的可选参数。那么下面代码对make_sound_twice的可选参数的处理方式有问题吗?

class Cat(object):
    def __init__(self):
        self.default_sound = 'meow'

    def make_sound_twice(self, sound=None):
        if sound is None:
            sound = self.default_sound
        print("{sound} {sound}".format(sound=sound))


kitty = Cat()

kitty.make_sound_twice()

custom_sound = 'hiss'
kitty.make_sound_twice(custom_sound)

custom_sound = 0
kitty.make_sound_twice(custom_sound)

这将打印以下行:

meow meow
hiss hiss
0 0

self 那时没有定义,所以我不能简单地设置一个默认值来代替None

def make_sound_twice(self, sound=self.default_sound):

【问题讨论】:

  • 您的代码不是检查变量是否已定义,而是检查其值。

标签: python optional-parameters


【解决方案1】:

您显示的代码绝对没有问题。事实上,它非常地道。

我经常读到检查变量是否已定义在某种程度上是一个糟糕的设计选择

在您展示的示例中,变量定义的。它只是设置为None

is None 检查它完全没问题。在某些情况下,可以使用以下技术将所有虚假值(None0"" 等)替换为默认值:

DEFAULT = ...

def f(arg = None):
   arg = arg or DEFAULT
   ...

但是,这不适用于您的情况,因为您声明您需要能够将零传递给您的函数。

【讨论】:

  • 在这种情况下应避免使用or 运算符如果有正当理由将“虚假”值作为参数传递。在这种情况下,如果传递的sound 参数是例如""0,它将打印default_sound。实际上 OP 表示能够打印0 是他的要求之一。
  • @ruohola:我只是在我的答案中添加了一条注释。谢谢提醒!
  • @ruohola:实际上,我完全忽略了问题中的零(感谢您指出这一点)。让我编辑答案以反映这一点。
  • 我总是使用is None,所以当 0 是有效输入时,我不会开枪打自己的脚。小猫在我期望“0 0”的地方说“喵喵”只是在现实生活中发生在我身上,并且让我感到困惑的时间超过了它应有的时间。虽然猫仍然是一个隐喻。 ;)
【解决方案2】:

你可以让它稍微干净一点:

def make_sound_twice(self, sound=None):
    sound = self.default_sound if sound is None else sound
    print("{sound} {sound}".format(sound=sound))

或者:

def make_sound_twice(self, sound=None):
    sound = sound if sound is not None else self.default_sound
    print("{sound} {sound}".format(sound=sound))

但你现在所做的只是惯用的 Python。

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 2012-01-20
    • 2021-04-21
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多