我有以下带有变量的类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)
GenericEncoder代码:
class GenericEncoder(json.JSONEncoder):
def default(self, obj):
return obj.__dict__
如注释中所述,它from
是一个Python关键字,因此您不能将其用作变量名或属性名。因此,您需要使用备用名称,并在读取或写入JSON数据时进行转换。
要进行输出转换,您可以为提供新的编码器json.dumps
;您可以通过重写ExchangeRates.json
方法来做到这一点。要进行输入转换,请覆盖ExchangeRates.from_json
。
在这两种情况下,策略都是相似的:我们创建字典的副本(因此我们不会对原始字典进行变异),然后创建具有所需名称和值的新键,然后删除旧键。
这是一个在Python 2.6和3.6上测试过的快速演示:
import json
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 ExchangeRatesEncoder(json.JSONEncoder):
def default(self, obj):
d = obj.__dict__.copy()
d['from'] = d['frm']
del d['frm']
return d
class ExchangeRates(JsonAware):
def __init__(self, frm, to, rate):
self.frm = frm
self.to = to
self.rate = rate
def json(self):
return json.dumps(self, cls=ExchangeRatesEncoder)
@classmethod
def from_json(cls, json):
d = json.copy()
d['frm'] = d['from']
del d['from']
return cls(**d)
# Test
a = ExchangeRates('a', 'b', 1.23)
print(a.json())
jdict = {"from": "z", "to": "y", "rate": 4.56, }
b = ExchangeRates.from_json(jdict)
print(b.json())
典型输出
{"from": "a", "to": "b", "rate": 1.23}
{"from": "z", "to": "y", "rate": 4.56}
问题内容: 在VB.NET中,我们可以将变量名称括在方括号中,并使用关键字作为变量名称,如下所示: 相当于C#: 我想知道是否有Java相当于这样做? 问题答案: 不可以。您可以添加下划线或类似的废话,但是基本上关键字是不可行的。
问题内容: 解决以下问题 的最有效方法 是什么?从交互式外壳程序: 目前,我正在解决以下问题: 但是看起来很笨拙… (python 2.7+或3.2+解决方案都可以) 问题答案: 使用关键字参数解包:
问题内容: 我有需要转换为Java对象的JSON。我需要处理的JSON如下所示: 在搜索引擎(在本例中为“ Jobs”)中输入搜索关键字时,将返回此JSON。我还没有命名这些要创建的变量,这个JSON只是从类似的早期应用程序中“送给”我的。因此,我显然在保存变量和抽象变量方面遇到麻烦。抽象是一个保留关键字,在我读过的任何地方,保留关键字都不能用作变量名。 我无法访问正在更新的以前的应用程序,我想指
问题内容: 为什么下面的工作? 而这不起作用: 更清楚地说:目前,我无法将CSS属性作为变量传递给animate函数。 问题答案: 是有效的对象文字。该代码将创建一个对象,其属性名为,值为10。以下两项相同: 在ES5及更早版本中,不能在对象文字中使用变量作为属性名称。您唯一的选择是执行以下操作: ES6 将 _ComputedPropertyName_定义为对象文字语法的一部分,这使您可以编写如
问题内容: 具体来说,我正在尝试使用字符串任意过滤ORM。我已经尝试过exec和eval解决方案,但是我遇到了麻烦。下面的代码不起作用,但这是我知道如何解释我要去的地方的最好方法 问题答案:
问题内容: 假设我有一个这样的模型: 为了从纽约获得用户列表,这是我的查询: 为了获得去USC的用户列表,这是我的查询: 为了获得纽约的用户列表以及去过南加州大学的用户,这是我的查询: 现在,我想基于变量的值动态生成这些查询。 例如,我的变量可能如下所示: 或像这样: …甚至像这样: 您能帮我编写一个将字典(或词典列表)作为输入,然后动态构建正确的sqlalchemy查询的函数吗? 如果我尝试为关