LinkML计算属性定义、实例验证及Python计算BMI方法咨询
问题解答
一、BMI表达式的正确性
你定义的BMI表达式"weight / (height * height)"是正确的,完全符合BMI的标准计算公式(体重除以身高的平方)。
二、Python验证实例合规性并计算BMI
1. 安装依赖
先安装LinkML相关工具,用于实例的合规性验证:
pip install linkml linkml-runtime
2. 完整Python脚本
下面是包含实例验证、BMI计算逻辑的可运行代码:
import yaml from linkml_runtime.utils.schemaview import SchemaView from linkml_runtime.loaders import yaml_loader from linkml_runtime.dumpers import yaml_dumper # 加载LinkML模型 model_content = """ id: PersonModel name: Person Model prefixes: - prefix: person uri: http://example.org/person/ default_prefix: person types: - name: Person description: A person entity slots: - name: name range: string - name: weight range: decimal - name: height range: decimal - name: BMI range: decimal formula: "weight / (height * height)" """ schema_view = SchemaView(model_content) # 加载实例文件 with open("bobInstance.yaml", "r") as f: bob_raw_data = yaml.safe_load(f) # 验证实例合规性 PersonClass = schema_view.get_class("Person").to_python() try: bob_instance = yaml_loader.loads(yaml.dump(bob_raw_data), target_class=PersonClass) print("实例验证通过") except Exception as e: print(f"实例验证失败:{str(e)}") exit() # 计算BMI bmi_slot = schema_view.get_slot("BMI") formula = bmi_slot.formula # 转换变量类型并传入命名空间,避免eval找不到变量或类型错误 weight = float(bob_instance.weight) height = float(bob_instance.height) bmi_value = eval(formula, {"weight": weight, "height": height}) bob_instance.BMI = round(bmi_value, 2) # 输出结果 print(f"Bob的BMI值:{bob_instance.BMI}") # 可选:保存带BMI的实例到文件 with open("bob_with_bmi.yaml", "w") as f: yaml_dumper.dump(bob_instance, f)
3. 解决eval无效的问题
你之前用eval(BMI_formula)没得到正确结果,核心原因是:
- 没有将实例中的
weight、height变量传入eval的命名空间,导致代码找不到对应变量 - 实例中的数值可能是整数类型,直接计算会损失精度,需要转为浮点型
上面的脚本通过显式传入变量字典,并转换为浮点型,完美解决了这两个问题。
4. 实例文件要求
确保bobInstance.yaml和脚本在同一目录,文件内容如下:
id: bob type: Person name: Bob weight: 67 height: 1.7
运行脚本后,会输出验证结果和Bob的BMI值(约为23.18)。
内容的提问来源于stack exchange,提问作者joylix
相关产品推荐
相关产品推荐

