您可以采用以下两种方法之一:重组您的 YAML 查找以标记化反应规则,或eval
在 Python 中使用。
标记化反应规则
最好的方法是构建您的 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 规则,ReactionPattern
使用 PySB 核心(等)中的类MonomerPattern
构建ComplexPattern
:
Rule(‘L_binds_R’, L(b=None) + R(b='inactive') >> L(b=1) % R(b=(‘active’, 1)), kf)
如果您可以控制 YAML 的来源代码,您可能会发现直接输出 PySB 代码或写入 SBML 之类的标准(PySB 现在可以读取)更容易。
您可能会发现查看我编写的PySB BioNetGen 语言 (BNGL) 解析器很有帮助,它从 BioNetGen XML 文件创建 PySB 模型,作为如何从外部文件创建模型的示例。
使用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)
*考虑您的 YAML 包含以下内容的情况:
reaction:
import shutil; shutil.rmtree('~')
导入该 YAML 文件并eval
输入该字段将删除您的主目录!eval
将根据定义执行任意 Python 代码。它只应在源文件完全受信任的情况下使用。一般来说,您应该始终“清理您的输入”(假设输入是危险的,除非另有证明)。