Python 在dict.get()中使用变量值作为默认值是错误的模式吗?

Python 在dict.get()中使用变量值作为默认值是错误的模式吗?,python,Python,我目前正在编写一些代码,这些代码通常具有以下模式: class Thing: defaults = { 'on':1, 'off': 0 } def something(self, k, v): # if v is a key in the defaults, replace its value if v in self.defaults: v = self.defaults[v]

我目前正在编写一些代码,这些代码通常具有以下模式:

class Thing:
    defaults = {
        'on':1,
        'off': 0
    }
    def something(self, k, v):
        # if v is a key in the defaults, replace its value
        if v in self.defaults: 
            v = self.defaults[v]
        print(f'SET {k} {v}')
但是,我突然想到,我可以通过执行以下操作来缩短
if
语句:

class Thing2:
    defaults = {
        'on':1,
        'off': 0
    }
    def something(self, k, v):
        v = self.defaults.get(v, v)
        print(f'SET {k} {v}')

它很方便,但这是一种糟糕的做法吗?

用更具体的条件语句替换通用的if语句是可以的。它使意图更清晰、更简洁

但是,由于默认键和值不同,您在这里也进行了细微的类型更改。这可能会在以后引起问题

例如,如果您正在设置
v=defaults.get(v,v)
,并且存在默认值,则将其从字符串更改为整数。如果你只是把它们当作可打印的对象,那没关系。然而,如果你打算继续使用它们进行计算,这非常重要

所以问一个问题:我是不是在改变这种东西的类型?如果答案是“是”,请查找其他名称。否则就好了

制作混凝土,这很好,你正在打印可打印的东西:

class Thing2:
    defaults = {
        'on':1,
        'off': 0
    }
    def something(self, k, v):
        v = self.defaults.get(v, v)
        print(f'SET {k} {v}')
这不好,您正在更改类型

class Thing3:
    defaults = {
        'on':1,
        'off': 0
    }
    def something(self, k: int, v):
        v = self.defaults.get(v, v)
        return k + v

print("The total is: " + thing.something(10, 'on')) # TypeError probably
这也没关系,因为类型不会改变

class Thing4:
    defaults = {
        'on':"1"
        'off': "0"
    }
    def something(self, k, v):
        v = self.defaults.get(v, v)
        return k + v

print(thing.something('The result is: ' + 'on')

不,为什么会是坏习惯?但是,两种代码中都没有替换值。我认为在这里使用
get
没有问题。一个问题是,如果您必须计算表达式(
get(v,v+3)
)或创建一个新对象(
get(v,set())
),以便将可能未使用的值作为第二个参数传递,但这里不是这样。真的,这是个人喜好的问题。好的,谢谢。为了添加更多的上下文,代码的一部分是解析一种简单的自定义脚本语言,该语言用于设置和测试仪器传感器的值。它使用户有时更容易在测试中设置高/低/开/关/等值的默认值,并有助于可读性,但有时它们是唯一的。用户可以定义
set tag on
和/或
set tag 0.02
,以同样的方式进行解析。这与
get
与显式
if
语句的对比问题无关。@chepner我已对其进行了更新,以首先解决一般情况。