在 python 脚本中引入 YAML 字符串
Introducing a YAML string in a python script
我正在开发一个 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的包)并且反应属性被存储为一个字符串。
那么pysb中的规则需要指定为:
# Rule(name, reaction, constant)
Rule('L_binds_R', L(unbound) + R(inactive) >> L(bound)%R(active), kf)
我的问题在于 yaml 中的 'reaction' 字段作为字符串存储在 python 对象中,但 pysb 不接受纯文本以外的任何其他格式。
我已经在 PySB 中检查过,反应字段在任何情况下都不能是字符串,我没有找到如何在 YAML 中转义变量的格式。
有解决问题的办法吗?
您可以通过以下两种方式之一解决此问题:重组您的 YAML 查找以标记化反应规则,或使用 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 核心中的 类 构建 ReactionPattern
(MonomerPattern
、ComplexPattern
和等等):
Rule(‘L_binds_R’, L(b=None) + R(b='inactive') >> L(b=1) % R(b=(‘active’, 1)), kf)
如果您可以控制 YAML 的来源代码,您可能会发现直接输出 PySB 代码或者写入 SBML 这样的标准会更容易,PySB can now read.
您可能会发现查看我写的 PySB BioNetGen language (BNGL) parser 很有帮助,它从 BioNetGen XML 文件创建了一个 PySB 模型,作为如何从外部文件创建模型的示例.
使用eval
替代方法是使用 eval
。虽然这是更简单的解决方案,但出于安全原因,强烈反对*。但是,如果 YAML 文件都是由 you/your 自己的代码生成的,而您只想快速修复,那么就可以了。
举个例子:
# 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
ing 该字段会删除您的主目录! eval
将根据定义执行任意 Python 代码。它只应在源文件完全受信任的情况下使用。一般来说,你应该总是 "sanitise your inputs"(假设输入是危险的,除非证明不是这样)。
我正在开发一个 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的包)并且反应属性被存储为一个字符串。
那么pysb中的规则需要指定为:
# Rule(name, reaction, constant)
Rule('L_binds_R', L(unbound) + R(inactive) >> L(bound)%R(active), kf)
我的问题在于 yaml 中的 'reaction' 字段作为字符串存储在 python 对象中,但 pysb 不接受纯文本以外的任何其他格式。
我已经在 PySB 中检查过,反应字段在任何情况下都不能是字符串,我没有找到如何在 YAML 中转义变量的格式。
有解决问题的办法吗?
您可以通过以下两种方式之一解决此问题:重组您的 YAML 查找以标记化反应规则,或使用 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 核心中的 类 构建 ReactionPattern
(MonomerPattern
、ComplexPattern
和等等):
Rule(‘L_binds_R’, L(b=None) + R(b='inactive') >> L(b=1) % R(b=(‘active’, 1)), kf)
如果您可以控制 YAML 的来源代码,您可能会发现直接输出 PySB 代码或者写入 SBML 这样的标准会更容易,PySB can now read.
您可能会发现查看我写的 PySB BioNetGen language (BNGL) parser 很有帮助,它从 BioNetGen XML 文件创建了一个 PySB 模型,作为如何从外部文件创建模型的示例.
使用eval
替代方法是使用 eval
。虽然这是更简单的解决方案,但出于安全原因,强烈反对*。但是,如果 YAML 文件都是由 you/your 自己的代码生成的,而您只想快速修复,那么就可以了。
举个例子:
# 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
ing 该字段会删除您的主目录! eval
将根据定义执行任意 Python 代码。它只应在源文件完全受信任的情况下使用。一般来说,你应该总是 "sanitise your inputs"(假设输入是危险的,除非证明不是这样)。