<pre class="lang-py prettyprint-override"><code>class User:
def __init__(self, id):
self.id = id
def dict_merge(base_dct, merge_dct, add_keys=True):
# Source: https://gist.github.com/angstwad/bf22d1822c38a92ec0a9#gistcomment-3077371
rtn_dct = base_dct.copy()
if add_keys is False:
merge_dct = {
key: merge_dct[key] for key in set(rtn_dct).intersection(set(merge_dct))
}
rtn_dct.update(
{
key: dict_merge(rtn_dct[key], merge_dct[key], add_keys=add_keys)
if isinstance(rtn_dct.get(key), dict) and isinstance(merge_dct[key], dict)
else merge_dct[key]
for key in merge_dct.keys()
}
)
return rtn_dct
ITEMS = ["item_1", "item_2"]
DEFAULT_PLAYER_DATA = {
"inventory": {item: 0 for item in ITEMS},
"quests": {
"completed": "0",
"running": False,
"start": None,
"end": None,
"duration": None,
},
"trees": 2,
"daily_claim": None,
}
# In this example I am using a variable instead of a file
# as reading and saving the json is not part of your problem
player_data_file = {
"1": {
"inventory": {
"item_1": 9999,
},
"trees": 9999,
},
}
def setup(user):
player_data_from_file = player_data_file.get(str(user.id), {})
player = dict_merge(DEFAULT_PLAYER_DATA, player_data_from_file)
player_data_file[str(user.id)] = player
# This is where you would save the updated player_data_file file/variable
return player
</code></pre>
<pre class="lang-py prettyprint-override"><code>user = User(1)
print(setup(user))
</code></pre>
<p>结果:<code>{'inventory': {'item_1': 9999, 'item_2': 0}, 'quests': {'completed': '0', 'running': False, 'start': None, 'end': None, 'duration': None}, 'trees': 9999, 'daily_claim': None}</code></p>
<pre class="lang-py prettyprint-override"><code>user = User(3) # Does not exist in file
print(setup(user))
</code></pre>
<p>结果:<code>{'inventory': {'item_1': 0, 'item_2': 0}, 'quests': {'completed': '0', 'running': False, 'start': None, 'end': None, 'duration': None}, 'trees': 2, 'daily_claim': None}</code></p>