【问题标题】:How to include text within a python file如何在 python 文件中包含文本
【发布时间】:2016-02-12 04:42:39
【问题描述】:

有几个与从外部文件读取python代码相关的问题,包括

Python: How to import other Python files

How to include external Python code to use in other files?

但不清楚如何包含来自外部文件的文本 sn-ps,这是 CPP #include 指令的标准做法。例如以下代码:

def get_schema():
    schema1 = \
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "id": "0",
    "type": "object",
    "properties": {
        "i": { "type": "integer" },
        "n": { "type": "string" }
    }
}
    return(schema1)

s = get_schema()
print(s)

返回预期的字典:

{'id': '0', '$schema': 'http://json-schema.org/draft-04/schema#', 'type': 'object', 'properties': {'i': {'type': 'integer'}, 'n': {'type': 'string'}}}

但我想做的是编写代码,以便它从不包含任何 python 代码(函数定义或变量分配)的外部文件导入变量定义:

def get_schema():
    schema1 = \
#include "schema1.json"
    return(schema1)

s = get_schema()
print(s)

我确信这可以通过一堆代码来打开定义文件,将内容读入字符串,添加 python 的前导和后导行,然后执行字符串,但似乎应该有一种更简单的方法来在函数定义中包含文本。有吗?

【问题讨论】:

  • Python 没有预处理器,因此您不能像在 C 中那样包含稍后编译的文本。例如,没有 #ifdef。虽然您可以使用if 0 跳过执行块,但块被编译为字节码并占用执行映像中的空间。
  • 不确定你到底在追求什么。在我看来,您有一个问题,想到了一个可能的解决方案(使用 c/c++ 范例)并希望在 python 中实现它。也许如果你更好地解释你原来的问题,我们可以提供一个 pythonic 解决方案。您能否提供一个更一般的示例来说明您将放入外部文件中的内容?我从您下面的评论中看到,您对比加载 JSON 数据更通用的东西感兴趣。
  • 对于一般情况“无法完成”是一个合理的答案。将 json 文件的开发和配置管理与 Python 文件分开似乎是一种很好的做法,如果这种模式再次出现在不同类型的数据(可能是常量定义?),知道正确的方法是使用或编写导入例程比想知道是否有内置替代方案要好。
  • @jorgeh,令我印象深刻的是,语法上有效的 json 字符串的子集也是语法上有效的 Python 右值。随之而来的两个问题是:1) 是否有任何有效的 json 字符串不是有效的直接可执行 Python,以及 2) 是否有任何其他独立开发的数据格式是 Python 语法的子元素。但鉴于 Python 不能导入比模块更小的任何东西,因此无需进一步考虑这些问题。
  • @Dave,至少有一种情况是有效的 JSON 不是有效的 python:{"flag": true}。 JSON 接受小写的true,但 python 会失败。可能还有其他情况,但至少这个回答了你的第一个问题。我不知道你的第二个问题。

标签: python json python-3.x


【解决方案1】:

如果您想从文件中加载 json,您可以使用 json 库:

import json

def get_schema():
    with open('schema1.json', 'r') as f:    
        return json.load(f)

【讨论】:

  • 您可能希望将'schema1' 更改为'schema1.json'。否则,如果这不能回答问题,则需要澄清 (imo)。
  • 我同意,但我不确定他的文件是否有 json 扩展名
  • 是的,这回答了我导入 json 的直接用例。但我仍然对是否可以在 python 中导入小于完整模块的单元的一般问题感兴趣,就像头文件导入 C 程序的方式一样。
  • 我认为这在 python @Dave 中是不可能的
猜你喜欢
  • 2019-04-26
  • 2017-04-06
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 2016-08-30
相关资源
最近更新 更多