背景:我正在编写一个应该管理我的音乐文件的python程序.它抓取目录并将以JSON编码的文件及其元数据(通过mutagen)作为简单的"数据库"放入文件中.我有很好的目录搜索,但是当我尝试保存数据库或编码为JSON时,它会抛出"TypeError:{...}不是JSON可序列化的"(...是来自dict的一些键和值,更多关于以下内容)
问题:程序按照以下格式构建一个大型字典对象:
{
"<song id>":{
"artist":"<song artist>",
"album":"<song album>",
"title":"<song title>"},
...
}
Run Code Online (Sandbox Code Playgroud)
每个歌曲文件都通过此格式编制索引.当我尝试将数据库转储到文件时,我得到了这个:
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
sit()
File "D:\workbench\ideas\musicmanager\v0\spider.py", line 116, in sit
json.dump(js.db,f,True)
File "C:\Python27\lib\json\__init__.py", line 181, in dump
for chunk in iterable:
File "C:\Python27\lib\json\encoder.py", line 428, in _iterencode
for chunk in _iterencode_dict(o, _current_indent_level):
File "C:\Python27\lib\json\encoder.py", line 402, in _iterencode_dict
for chunk in chunks:
File "C:\Python27\lib\json\encoder.py", line 402, in _iterencode_dict
for chunk in chunks:
File "C:\Python27\lib\json\encoder.py", line 436, …Run Code Online (Sandbox Code Playgroud) 我有以下python3代码:
class BaseTypeClass(type):
def __new__(cls, name, bases, namespace, **kwd):
result = type.__new__(cls, name, bases, namespace)
print("creating class '{}'".format(name))
return result
def __instancecheck__(self, other):
print("doing instance check")
print(self)
print(other)
return False
class A(metaclass=BaseTypeClass):
pass
print(type(A))
print(isinstance(A(), A))
Run Code Online (Sandbox Code Playgroud)
当我运行它时,Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32我得到以下输出
creating class 'A'
<class '__main__.BaseTypeClass'>
True
Run Code Online (Sandbox Code Playgroud)
为什么不输出doing instance check?该文件说,__instancecheck__方法需要在元类,而不是类本身,这是我在这里做定义.我甚至验证了自creating class 'A'打印以来正在使用的元类.但是,当我调用isinstance它时似乎使用默认实现而不是我在元类中定义的实现.
我可能没有正确使用元类,但我无法弄清楚我犯了哪些错误.
我注意到Javascript有一种奇怪的行为:当我执行时,1967779 << 11我得到一个负面结果:-264955904
但是,如果我在Python解释器中运行相同的行,我会得到正确的答案:4030011392
请注意,Firefox和Chrome的Javascript控制台都返回了相同的负数,因此它必须是Javascript本身而不是引擎的问题.
为什么我在Python和Javascript之间获得不同的值?我该怎么做才能解决这个问题?Javascript左移操作符如何工作?
python ×2
bit-shift ×1
class ×1
javascript ×1
json ×1
metaclass ×1
python-3.6 ×1
python-3.x ×1
typeerror ×1