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 对象的附加“成员”的主要内容,如果未能解决你的问题,请参考以下文章
(Python) 将 Playwright Page 对象传递给包装函数的函数装饰器