Python会自动在List中的浮点值周围添加单引号



我很难使用Python(3.9.7(自动在浮点值周围添加单引号,这会导致断言失败。

我的目标是使用pytest来断言解析函数的预期输出。解析器获取一个json对象(下面简称代码示例(,并返回Signal对象的列表。我在解析函数中复制了logging.debug(f"{signal_list}")的打印输出,并将其分配给测试函数中的expected_result

#Arrange   
message = json.dumps({"data":{"name":"battery_volt","alias":"Volt","unit":"volt","value":12.0,"time":1644587969}})

expected_result = [Signal(id=None, name='battery_volt', description=None, value=12.0, type=None, unit='volt', time='2022-02-11T13:59:29')]
print(expected_result)
p = Parser(message)
#Act   
result = p.parse_message()

#Assert  
assert result == expected_result   

令人恼火的是,pytest -vv抛出断言错误:

E         Full diff:
E         -  [Signal(id=None, name='battery_volt', description=None, value='12.0', type=None, unit='volt', time='2022-02-11T13:59:29')]
E         ?                                                                -    -
E         +  [Signal(id=None, name='battery_volt', description=None, value=12.0, type=None, unit='volt', time='2022-02-11T13:59:29')]

上一行似乎是expected_result的值,因为print(expected_result)还添加了围绕12.0 的单引号

我假设logging.debug(f"{signal_list}")的复制输出与结果的实际值不相同。我尝试将expected_result类型转换为列表,str((-在测试中转换resultexpected-result,但expected_result始终具有'12.0'result具有12.0

我迫切需要一个提示如何以正确的方式进行这种断言。

编辑:以下是解析函数:

def parse_message(self):
message = json.loads(self.message)
#logging.debug(f"message is: {message}")       
message_data = message.get('data', {})
parsed_data = []
try:
device = message_data.get('device', None)
if device is not None:
vehicle = self.parse_vehicle(device)
parsed_data.append(vehicle)
else:
logging.error("'device' was None!")
except Exception as e:
logging.error(e)

signals = []

try:
data = message_data.get('data', None)
if data is not None:
signals = self.parse_signals(data)
gps = message_data.get('gps', None)
if gps is not None:
gps_signal = self.parse_gps(gps)
signals.append(gps_signal)
parsed_data.append(signals)           
except Exception as e:
logging.error(e)

return parsed_data 
if __name__ == "__main__":
setup_logging()
message = json.dumps({"consumerid":redacted,"data":{"device":{"time":1644587969,"imei":"redacted","man_id":redacted,"car_id":999,"vin":"redacted"},"data":[{"name":"battery_volt","alias":"Volt","unit":"volt","value":12.0,"time":1644587969}],"gps":{"lat":51.437515,"lon":6.9281199,"dir":252,"alt":88,"sat":19,"time":1644587969}},"event":"redacted","itemid":redacted,"itemtype":1,"senderip":"redacted"})
p = Parser(message)
signal_list = p.parse_message() 
logging.debug(f"{signal_list}")

请注意,传递的json对象比原始文章中的代码示例更复杂。

class Signal(BaseModel):
id: int = None
name: str = None
description: str = None
value: str = None
type: str = None
unit: str = None
time: str = None 

EDIT2-Signal.value的分配发生在此处:

def parse_signals(self, data):
signals = []
#logging.debug(f"data is : {data}")
for data_object in data:
signal = Signal()
try:
signal.name = data_object.get('name', None)
#get dtc-count value as seperate return-element, needed by the controller to handle dtc-codes
if signal.name == 'dtc_count':      
self.dtc_count == data_object.get('value', None)   
signal.description = data_object.get('description', None)
signal.value = data_object.get('value', None)
signal.time = datetime.datetime.utcfromtimestamp(data_object.get('time', None)).isoformat()
signal.unit = data_object.get('unit', None)
if signal.unit == "dtc":
signal.type = "1" 
if signal.name is not None:
signals.append(signal)
#logging.debug(signal.__dict__)                
except Exception as e:
logging.error(f"While parsing signal {data_object}, the following error occured: {e}")

return signals

当parse_message被调用为__name__ == "main":时,下面的测试代码输出value=12.0

好吧,事实证明python类型的提示并没有像我预期的那样强制执行:

当通过__name__ == "main":调用parse_message时,下面的测试代码输出value=12.0。显然,尽管Signal.value的类型提示为str,12.0还是被指定为float。当我尝试sys.stdout.write(signal_list(时,我得到了一个TypeError。

我现在只需str((-在parse_signals((中进行转换,如下

signal.value = str(data_object.get('value', None))

从而使我的价值在单引号中保持一致。

最新更新