使用python中的suds lib动态创建对象并设置其属性

时间:2015-10-27 15:29:50

标签: python object dynamic suds

我正在使用覆盆子将一些传感器数据发送到SOAP Web服务。 RPi从串口获取数据。格式为'DATE,VALUE1,VALUE2,VALUE3,VALUE4 \ r \ n'。 Web服务请求如下所示

  <sensors>
    <Sensor>
      <SensorId>int</SensorId>
      <NodeId>int</NodeId>
      <SensorTypeId>int</SensorTypeId>
      <Value>double</Value>
      <Status>string</Status>
      <Date>dateTime</Date>
      <Deleted>boolean</Deleted>
      <Updated>boolean</Updated>
      <RemoteId>int</RemoteId>
      <DateOfLastUpdate>dateTime</DateOfLastUpdate>
      <UserId>int</UserId>
      <ErrorMessage>string</ErrorMessage>
    </Sensor>
    <Sensor>
      <SensorId>int</SensorId>
      <NodeId>int</NodeId>
      <SensorTypeId>int</SensorTypeId>
      <Value>double</Value>
      <Status>string</Status>
      <Date>dateTime</Date>
      <Deleted>boolean</Deleted>
      <Updated>boolean</Updated>
      <RemoteId>int</RemoteId>
      <DateOfLastUpdate>dateTime</DateOfLastUpdate>
      <UserId>int</UserId>
      <ErrorMessage>string</ErrorMessage>
    </Sensor>
  </sensors>
  <username>string</username>
  <password>string</password>
  <UniqueClientID>string</UniqueClientID>
  <project>string</project>

我从串口获得的每一行都有4个传感器值,并记录了这些值的日期时间。因此,我需要使用SUDS库方法client.factory.create()为串行解析的每一行创建4个对象,将值添加到每个属性,并将对象追加()到Web服务接受的Sensor对象数组中作为它的第一个参数。问题是我找不到动态创建对象的方法,输入属性的值,并将它们附加到大数组。我将从串口解析大约600行,因此需要创建4x600 = 2400。像这样的硬编码对象名称

while True:
serial_str = port.readline()
if serial_str:
    string_list = serial_str.split(',')
    date = 'T'.join( [ string_list[i] for i in [0, 1] ] )
    temperature = string_list[2]
    humidity = string_list[3]
    rain = string_list[4]
    wind = string_list[5].replace("\r\n","")
    Sensor_obj1 = client.factory.create('Sensor')
    Sensor_obj1.SensorId = -1
    Sensor_obj1.NodeId = 1
    Sensor_obj1.SensorTypeId = 2
    Sensor_obj1.Value = temperature
    Sensor_obj1.Status = ''
    Sensor_obj1.Date = date
    Sensor_obj1.Deleted = 0
    Sensor_obj1.Updated = 0
    Sensor_obj1.RemoteId = 0
    Sensor_obj1.DateOfLastUpdate = datetime.now().strftime('%Y-%m-%dT%H:%M:%S')datetime.now()
    Sensor_obj1.UserId = 0
    Sensor_obj1.ErrorMessage = ''
    Sensor_list_obj.Sensor.append(Sensor_obj1)
    Sensor_obj2 = client.factory.create('Sensor')
    ...
如果我只有一行发送,

会工作,但即便如此,它的编程风格也不错。我刚开始使用python 2.x,所以如果有人能指出我正确的方向,我将不胜感激。提前致谢

1 个答案:

答案 0 :(得分:0)

我对手头的问题不太熟悉,但我猜你可以在调用client.factory.create(&#39; Sensor&#39;)调用时添加更多参数。它是否接受,** kwargs,以便您可以致电:

client.factory.create('Sensor', SensorID=-1, NodeId=1, ...)

如果没有,您始终可以通过以下方式抽象初始化:

  • 创建一个可以完成所有操作的功能,并隐藏“gory”#39;细节。这很优雅,如果你刚刚开始用python编程,你可能不应该尝试更高级的东西。
  • 创建一个继承自suds的传感器类。不幸的是,我对这类对象并不完全了解&#39; client.factory.create&#39;。

另外,我想我会创建一个传感器列表(或者字典,如果在你的代码中有意义的话),这样你就可以将所有传感器附加到那个结构中,否则你的程序将无法使用或五个传感器而不是4.