Python - 将 JSON 对象传递给函数时附加到 JSON 对象的附加“成员”

Posted

技术标签:

【中文标题】Python - 将 JSON 对象传递给函数时附加到 JSON 对象的附加“成员”【英文标题】:Python - Additional "members" appended to JSON object when passing it to function 【发布时间】:2019-04-12 15:19:54 【问题描述】:

我有以下 JSON 对象位于它自己的名为 build.json 的文件中:


    "name": "utils",
    "version": "1.0.0",
    "includes": [],
    "libraries": [],
    "testLibraries": []

我使用以下方法在我的 Python 程序中获取此对象:

def getPackage(packageName):
    jsonFilePath = os.path.join(SRCDIR, packageName, "build.json")
    packageJson = None
    try:
        with open(jsonFilePath, "r") as jsonFile:
            packageJson = json.load(jsonFile)
    except:
        return None
    return packageJson

我验证当前包(这是我正在迭代的许多包之一)的 JSON 对象在以下方法中没有返回 None。请注意,我暂时打印出字典的键:

def compileAllPackages():
    global COMPILED_PACKAGES

    for packageName in os.listdir(SRCDIR):
        package = getPackage(packageName)
        if package == None:
            continue

        # TEMP ==============
        for i in package:
            print(i)
        # ===================

        compiledSuccessfully = compilePackage(package)
        if not compiledSuccessfully:
            return False
    return True

最后,一旦在 compilePackage 函数中接收到字典的键,我目前也在打印出来:

def compilePackage(package):
    global COMPILED_PACKAGES, INCLUDE_TESTS

    # TEMP ==============
    for i in package:
        print(i)
    # ===================        

    ...

compileAllPackages 函数的输出:

name
version
includes
libraries
testLibraries

compilePackage 函数的输出:

name
version
includes
libraries
testLibraries
u
t
i
l
s

我一生都无法弄清楚在该函数调用期间我的字典发生了什么???请注意,build.json 文件位于名为“utils”的目录中。

编辑: Python 脚本与 build.json 文件分开放置,并且适用于绝对路径。还需要注意的是,在得到那个奇怪的输出之后,我在稍后尝试访问有效键时也会得到以下异常(似乎认为字典是字符串?...):

Traceback (most recent call last):
  File "/Users/nate/bin/BuildTool/unix/build.py", line 493, in <module>
    main()
  File "/Users/nate/bin/BuildTool/unix/build.py", line 481, in main
    compiledSuccessfully = compileAllPackages()
  File "/Users/nate/bin/BuildTool/unix/build.py", line 263, in compileAllPackages
    compiledSuccessfully = compilePackage(package)
  File "/Users/nate/bin/BuildTool/unix/build.py", line 287, in compilePackage
    compiledSuccessfully = compilePackage(include)
  File "/Users/nate/bin/BuildTool/unix/build.py", line 279, in compilePackage
    includes = getPackageIncludes(package)
  File "/Users/nate/bin/BuildTool/unix/build.py", line 194, in getPackageIncludes
    includes = [package["name"]]    # A package always includes itself
TypeError: string indices must be integers

编辑:如果我将参数名称更改为“包”以外的名称,我将不再得到那个奇怪的输出或稍后的异常。然而,这不一定是一个修复,因为我不知道名称“包”可能有什么问题。也没有这样命名的全局变量。

【问题讨论】:

我和@benediktwerner 在一起。我不认为“utils”部分来自此代码中的任何地方。尝试在代码中搜索打印的所有其他点,看看它是否来自其中之一。更好的是,在 for 循环之前和之后打印一些内容,例如说 ########,这样您就可以正确划分该部分的输出开始和结束的位置。 @Karuhanga 我可以注释掉我所有的打印输出,这样除了异常之外我没有任何输出。然后,如果我在 compilePackage 函数中只允许一个打印循环,结果如上所示。我不相信打印缓冲区中有任何没有事先刷新的内容。 你试过print(package)看看你得到了什么? @Idlehands 是的。如果我用上面的 print(package) 替换每个循环打印,从 compileAllPackages,我得到:'name': 'utils', 'version': '1.0.0', 'includes': [], 'libraries': [], 'testLibraries': [] 和从 compilePackage,我得到(仍然在末尾加上那个奇怪的 utils 字符串):'name': 'utils', 'version': '1.0.0', 'includes': [], 'libraries': [], 'testLibraries': [] utils 【参考方案1】:

答案最终变得非常愚蠢。由于包可能依赖的任何依赖关系,compilePackage() 有可能被递归调用。在对函数的递归调用中,我将字符串传递给函数而不是字典。

【讨论】:

【参考方案2】:

我试过你的代码,结果是这样的

compileAllPackages 函数的输出:

name
version
includes
libraries
testLibraries

compilePackage 函数的输出:

name
version
includes
libraries
testLibraries

我的目录结构是这样的

├── test.py
└── tt
    └── cc
        └── utils
            └── build.json

我认为你的代码是正确的,应该是你传递的路径参数不正确。

【讨论】:

it should be that the path parameter you passed is incorrect。这并不能解释为什么相同的代码会有不同的输出。 这不是答案,必须作为评论发布。

以上是关于Python - 将 JSON 对象传递给函数时附加到 JSON 对象的附加“成员”的主要内容,如果未能解决你的问题,请参考以下文章

将 Json 复杂对象传递给 HttpPost 调用

(Python) 将 Playwright Page 对象传递给包装函数的函数装饰器

将对象作为参数传递给函数

如何将 JSON 对象传递给 Flask 中的模板?

Javascript ajax 将动态创建的 json 对象传递给 Web 服务

如何将参数传递给反序列化json的构造函数