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我已对其进行了更新,以首先解决一般情况。