小编c89*_*f64的帖子

处理可选的 python 字典字段

我正在处理加载到 Python 字典中的 JSON 数据。其中很多都有可选字段,其中可能包含字典之类的东西。

dictionary1 = 
{"required": {"value1": "one", "value2": "two"},
"optional": {"value1": "one"}}

dictionary2 = 
{"required": {"value1": "one", "value2": "two"}}
Run Code Online (Sandbox Code Playgroud)

如果我这样做,

dictionary1.get("required").get("value1")
Run Code Online (Sandbox Code Playgroud)

显然,这是有效的,因为场"required"总是存在的。

但是,当我使用同一行dictionary2(以获取可选字段)时,这将产生一个AttributeError

dictionary2.get("optional").get("value1")
AttributeError: 'NoneType' object has no attribute 'get'
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为第一个.get()将返回None,而第二个.get()不能调用.get()None 对象。

我可以通过提供默认值来解决这个问题,以防可选字段丢失,但是数据变得越复杂,这就会很烦人,所以我称之为“天真的修复”:

dictionary2.get("optional", {}).get("value1", " ")
Run Code Online (Sandbox Code Playgroud)

因此,第一个.get()将返回一个空字典{},可以在其上调用第二个字典.get(),并且由于它显然不包含任何内容,因此它将返回空字符串,如第二个默认值所定义的那样。

这将不再产生错误,但我想知道是否有更好的解决方案 - 特别是对于更复杂的情况(value1包含数组或另一个字典等......)

我也可以用 try - except 来解决这个问题AttributeError,但这也不是我喜欢的方式。

try:
    value1 = dictionary2.get("optional").get("value1")
except AttributeError:
    value1 …
Run Code Online (Sandbox Code Playgroud)

python json dictionary attributeerror

5
推荐指数
2
解决办法
2146
查看次数

使用flask_restful和flask_caching进行循环导入

我在项目中使用flask_restful已经有一段时间了,因为我喜欢将资源分成不同的文件以进行基本组织。现在我想添加flask_caching,但遇到了(简单?)循环导入问题

我的项目结构是这样的

flask_api.py
-resources
--my_resource.py
--my_other_resource.py
--so_many_more_resources.py
Run Code Online (Sandbox Code Playgroud)

my_resources.py 的端点添加到flask_api.py 中,我还在其中创建了flask_cache 缓存对象,如下所示:

# flask_api.py
from flask import Flask
from flask_restful import Api
from flask_caching import Cache
from resources import my_resource
app = Flask(__name__)
cache = Cache(app, config={'sample config'})
api = Api(app)
api.add_resource(my_resource.GetStuff, '/api/v2/stuff/get')
# this file also runs the app
Run Code Online (Sandbox Code Playgroud)

然后我(尝试)将缓存导入到 my_resource.py - 我在其中使用 @cache 装饰器

# resources/my_resource.py
from flask_api import cache
class GetStuff(Resource):
    @cache.memoize(timeout=30)
    def get():
        return "Stuff"
Run Code Online (Sandbox Code Playgroud)

但这会导致可怕的循环导入问题。我可以将所有资源导入夹在该cache = Cache(...)线上方api.add_resource()。然而,这感觉像是一种黑客代码的味道,并且是一个非常非常多肉的三明治。我宁愿将它们全部放在文件的顶部。

解决这个问题的正确方法是什么?(希望不要彻底修改大部分代码库)

tl;dr:flask_api 创建缓存并导入资源 -> 资源无法从flask_api …

python flask flask-restful flask-caching

2
推荐指数
1
解决办法
1536
查看次数