在python脚本中引入YAML字符串

2024-05-13 20:30:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python代码,能够读取YAML文件并在PySB中生成基于规则的模型。在

在YAML文件中指定一个新规则,如下所示:

--- !rule
name: L_binds_R
reaction:
    L(unbound) + R(inactive) >> L(bound)%R(active)
rates:
    - Kf

通过这个,我在python中创建了一个pyyaml对象(pyyaml是一个在python中使用yaml的包),并且将reaction属性存储为一个字符串。在

那么,pysb中的规则需要指定为:

^{pr2}$

我的问题在于,yaml中的“reaction”字段作为字符串存储在python对象中,但pysb不接受纯文本以外的任何其他格式。在

我已经检查了PySB,并且在任何情况下,反应字段都不能是字符串,而且我没有找到如何在YAML中处理变量的格式化。在

有什么办法解决这个问题吗?在


Tags: 文件对象字符串代码name模型yaml规则
1条回答
网友
1楼 · 发布于 2024-05-13 20:30:40

您可以从两种方法中选择一种:重新构造YAML find以标记反应规则,或者在Python中使用eval。在

标记化反应规则

最好的方法是构造你的YAML文件,这样你的反应规则已经在单个标记中指定了,而不仅仅是整个反应的一个字段,例如

 - rule!
name: L_binds_R
reaction:
    reactant:
        name: L
        site: b
    reactant:
        name: R
        site: b
            state: inactive         
    product:
        name: L
        site: b
            bond: 1
    product:
        name: R
        site: b
            bond: 1
            state: active
    fwd_rate: kf

然后,您可以编写一个解析器将其转换为以下PySB规则,使用PySB core中的类(MonomerPatternComplexPattern等)构建{}:

^{pr2}$

如果您控制了YAML的来源代码,那么您可能会发现直接输出PySB代码或编写类似SBML的标准更容易,后者PySB can now read。在

{sb从一个文件中创建一个很有帮助的外部模型。在

使用eval

另一种选择是使用eval。虽然这是一个更简单的解决方案,但出于安全考虑,强烈不鼓励使用这种方法*。但是,如果YAML文件都是由您/您自己的代码生成的,并且您只需要一个快速修复,这就可以了。在

下面是一个例子:

# You would read these in from the YAML file, but I’ll just define
# the strings here for simplicity
reaction_name = "L_binds_R"
reaction_str = "L(b=None) + R(b='inactive') >> L(b=1) % R(b=('active', 1))"
reaction_fwd_rate = "Kf"

Rule(reaction_name, eval(reaction_str), eval(reaction_fwd_rate))
# Python output 
# (assumes Monomers L and R and parameter Kf are already defined):
# >>> Rule('L_binds_R', L(b=None) + R(b='inactive') >> L(b=1) % R(b=('active', 1)), Kf)

*考虑一下你的山药含有以下内容:

reaction:
    import shutil; shutil.rmtree('~')

导入该YAML文件并eval将删除您的主目录!eval将按定义执行任意Python代码。它只应在源文件完全受信任的情况下使用。一般来说,您应该始终“清理您的输入”(假设输入是危险的,除非得到证明)。在

相关问题 更多 >