Python 3'ün json.dumps
numaralı uygulamasında bazı garip davranışlar gözlemledim, yani aynı nesneyi infazdan çalıştırmaya her bıraktığımda anahtar sipariş değişiklikleri. Anahtarlar, anahtarları sıralamakla ilgilenmediğim için işe yaramadı, sadece aynı kalmasını istiyorum!JSON anahtar sırasını Python 3 json.dumps ile nasıl sabit tutarım?
$ python print_data.py
{
"groceries": [
"apples",
"bananas",
"pears"
],
"isadmin": false,
"nested": {
"value": 2153.23412,
"complex": true
},
"email": "[email protected]",
"number": 42,
"name": "John Doe",
"balance": 235.03
}
Ama sonra yeniden çalıştırın ve ben olsun: Bu komut dosyasını çalıştırdığınızda
import json
data = {
'number': 42,
'name': 'John Doe',
'email': '[email protected]',
'balance': 235.03,
'isadmin': False,
'groceries': [
'apples',
'bananas',
'pears',
],
'nested': {
'complex': True,
'value': 2153.23412
}
}
print(json.dumps(data, indent=2))
Ben örneğin, farklı çıkışları her zaman olsun: İşte bir örnek script
$ python print_data.py
{
"email": "[email protected]",
"balance": 235.03,
"name": "John Doe",
"nested": {
"value": 2153.23412,
"complex": true
},
"isadmin": false,
"groceries": [
"apples",
"bananas",
"pears"
],
"number": 42
}
Sözlüklerin sıralanmamış koleksiyonlar olduğunu ve siparişin bir karma işlevine dayandığını; ancak Python 2'de - sipariş (her ne ise) sabittir ve yürütme başına değişmez. Buradaki zorluk, testlerimin yürütülmesi zor olmasıdır çünkü iki farklı modülün JSON çıktısını karşılaştırmam gerekiyor!
Neler olduğu hakkında bir fikrin var mı? Nasıl düzeltilir? Bir OrderedDict kullanmaktan kaçınmak veya herhangi bir sıralama yapmak istemediğimi ve önemli olanın dize gösteriminin infazlar arasında aynı kalması olduğunu belirtmek isterim. Ayrıca bu sadece test amaçlıdır ve modülümün uygulanması üzerinde herhangi bir etkisi yoktur.
Siparişin Python 2'de düzeltilmesinin tek nedeninin, yanlışlıkla 'sort_keys = True' –
@WayneWerner'ın kazara olmadıkça garanti edilemeyeceğini garanti edebilirim; hash fonksiyonları belirleyicidir - aşağıdaki yorumları görün, rastgele bir hash tohumu eklenmesi nedeniyle Python 3.3'ten sonra sipariş değişiklikleri. – bbengfort
Eh, ben düzeltilmeyi bekliyorum! Çok ilginç. –