我正在使用 Python 和 PyYAML 为一个项目编写文件类型转换器,我在该项目中多次与 YAML 文件相互转换。这些文件随后由我无法控制的单独服务使用,因此我需要将 YAML 翻译回与最初获得的相同。我的原始文件包含以下部分:
key:
- value1
- value2
- value3
Run Code Online (Sandbox Code Playgroud)
其评估为{key: [value1,value2,value3]}使用yaml.load(). 当我将其转换回 YAML 时,我的新文件如下所示:
key: [value1,value2,value3]
Run Code Online (Sandbox Code Playgroud)
我的问题是,就 YAML 文件的各种语言解析器而言,这两种形式是否等效。显然,使用 PyYaml,这些是等效的,但是对于应用程序正在使用的 Ruby 或其他语言,这是否适用?否则,应用程序将无法正确显示数据。
我已经使用PyYAML解析器几个月了,将文件类型转换为数据管道的一部分.我发现解析器有时非常特殊,似乎今天我偶然发现了另一个奇怪的行为.我正在转换的文件包含以下部分:
off:
    yes: "Flavor text for yes"
    no: "Flavor text for no"
Run Code Online (Sandbox Code Playgroud)
我保留了字典中当前嵌套的列表,以便我可以构建一个平面文档,但保存嵌套以便稍后转换回YAML.我得到一个TypeError说法,我试图连接str和bool键入在一起.我调查并发现PyYaml实际上是将上面的部分文本转换为以下内容:
with open(filename, "r") as f:
    data = yaml.load(f.read())
print data
>> {False: {True: "Flavor text for yes", False: "Flavor text for no}}
Run Code Online (Sandbox Code Playgroud)
我做了一个快速检查,发现PyYAML是做这行yes,no,true,false,on,off.如果键不加引号,它只会执行此转换.引用的值和键将被正确传递.寻找解决方案,我发现这里记录了这种行为.
虽然对其他人来说知道引用键会停止PyYAML这样做可能会有所帮助,但我没有这个选项,因为我不是这些文件的作者,并且编写了我的代码来尽可能少地触摸数据.
是否有针对此问题的解决方法或覆盖默认转换行为的方法PyYAML?
我有一个Django 1.9应用程序,该应用程序正在运行一段代码,根据对某些远程API的查询结果,对数据库进行更改。例如,这可能是有关提交,文件更改,审阅者,拉取请求等的数据,这些数据我想另存为数据库中的实体。
commit_data = commit_API_client.get_commit_info(argument1, argument2)
new_commit = models.Commit.Create(**commit_data)
#if the last API failed, this will fail
#I will need to run this again to get these files, so I need
#to get the commit all over again, too
files = file_API_client.get_file_info(new_commit.id)
new_files = models.Files.Create(**files)
#do some more stuff here 
Run Code Online (Sandbox Code Playgroud)
我正在调用的少数几个API之一很有可能会返回一些错误而不是有效数据。实际上,我基本上需要使这一部分成为一个原子事务,以便如果从中没有返回错误HTTP requests,我会将所有更改提交给数据库。否则,如果2个API正确返回,我可能会丢失一些数据,但第3个不会。
我看到Django支持commit hooks数据库事务,但是我想知道这是否适用于这种情况,以及我将如何实现这一点。