我有一个包含很多protobuf消息的项目,其中一些protobuf甚至包含其他内容也很多的消息。
因为涉及的参数太多,所以我编写的几乎所有函数都使用** kwargs而不是required / optional参数,所以我的函数通常如下所示:
def set_multiple_params(**kwargs):
header, smp_message = Writer.createMessage(SetMultipleParametersRequestMessage_pb2.SetMultipleParametersRequestMessage,
TIMESTAMP)
data = smp_message.multipleParametersData
data.maxPrice = kwargs['maxPrice'] if 'maxPrice' in kwargs else 15.54
data.minPrice = kwargs['minPrice'] if 'minPrice' in kwargs else 1.57
....
# list goes here with around 30 more checks like this, and finally
return Writer.serializeMessage(header, smp_message)
Writer只是一个小型库,它使用createMessage
函数将PacketHeader数据附加到消息中,而serializeMessage
只调用serializeToString
方法,并返回元组。
我在创建数据字典的方式中使用它,我将其传递给** kwargs。 我的代码有效,现在对我来说还不错,但是当我必须为每个函数编写50个这样的支票时,它很乏味。
所以问题是,除了这个以外,还有其他方法来检查** kwargs中的密钥,还是这是我最好的解决方案?我知道我可以使用链式,但我想知道是否有更容易或更多的Pythonic。
任何建议表示赞赏。
p / s:除了布尔值之外,两个键都没有相同的值。我已经使用any()
函数来避免编写代码的这些部分。
答案 0 :(得分:2)
data.maxPrice = kwargs.get('maxPrice', 15.54)