【发布时间】:2016-10-24 10:10:39
【问题描述】:
我有以下带有变量from、to 和rate 的类。 from 是一个关键字。如果我想在下面的init方法中使用它,正确的写法是什么?
更多上下文:该类明确需要from 变量,因为它是另一个开发人员用不同语言编写的POST 端点所需的json 的一部分。所以改变变量名是不可能的。
class ExchangeRates(JsonAware):
def __init__(self, from, to, rate):
self.from = from
self.to = to
self.rate = rate
JsonAware 代码:
class PropertyEquality(object):
def __eq__(self, other):
return (isinstance(other, self.__class__) and self.__dict__ == other.__dict__)
def __ne__(self, other):
return not self.__eq__(other)
def __repr__(self):
return '%s(%s)' % (self.__class__.__name__, ', '.join(['%s=%s' % (k, v) for (k, v) in self.__dict__.items()]))
class JsonAware(PropertyEquality):
def json(self):
return json.dumps(self, cls=GenericEncoder)
@classmethod
def from_json(cls, json):
return cls(**json)
通用编码器代码:
class GenericEncoder(json.JSONEncoder):
def default(self, obj):
return obj.__dict__
【问题讨论】:
-
您不能将其用作标识符,因为它是关键字。这就是关键字的意思!使用例如
from_代替。 -
from被使用了 3 次,它被标记为红色 3 次,我不需要使用 **kwargs 转义它们的关键字或其他东西吗? -
如果你愿意,你可以这样做:
setattr(self, 'from', kwargs.get('from')),但你也必须通过字典传递它:rates = ExchangeRates(..., **{'from': whatever}),并且只能通过getattr(rates, 'from')访问它。重命名它很多不那么尴尬。参见例如stackoverflow.com/q/9746838/3001761 -
标记为红色听起来像是一个 IDE 试图帮助作者 ;-) 我会听从 @jonrsharpe 的建议。
-
您可以使用该上下文和minimal reproducible example(
JsonAware是什么?)来扩展问题,可能有一些方法可以处理与键为关键字的 JSON 之间的解析。但是你绝对不能直接做。