我发现,对瓶自动完成有点欠缺-这是因为在内部,上下文特定的对象,如current_app,request和logger实际上LocalProxy秒。因此 PyCharm 不知道如何处理这种类型。
所以对我来说,显而易见的解决方案是在导入的模块上应用类型提示。除非你不能这样做!从 Python 3.7 开始,似乎没有这样的语法来促进这一点。
因此,下一个显而易见的解决方案是使用显式设置的类型制作每个特定于上下文的模块的本地副本,如下所示:
from logging import Logger
from flask import Flask, Request, Blueprint, request, current_app as app
app: Flask = app
logger: Logger = app.logger
request: Request = request
Run Code Online (Sandbox Code Playgroud)
...在您实际尝试启动服务器之前一直有效,在这种情况下,应用程序因以下原因崩溃 RuntimeError: Working outside of application context.
事实证明,我们实际上可以将相关类型提示封装在应用程序上下文内的类或其他范围内。
@foo_blueprint.route('/foo', methods=['GET'])
def foo(cls):
_app: Flask = app
_logger: Logger = app.logger
_request: Request = request
# ...
Run Code Online (Sandbox Code Playgroud)
...这有效,但在任何可以想象的意义上都非常尴尬。
是否有合理的解决方案可以在 Flask 的应用程序上下文中获取正确的类型提示?
我决定使用F#解决第2018号代码出现的第一天(执行循环求和并找到第一个重复的和)的第二个问题,但是性能不足,我找不到原因放缓.
对于具有~140,000个求和的给定输入,此代码在几秒钟内执行.
data = list(map(int, '''
+1
-1
'''.strip().splitlines()))
from itertools import cycle, accumulate
class superset(set):
def add(self, other):
super().add(other)
return other
def mapwhile(func, pred, iterable):
for i in iterable:
if not pred(i):
yield func(i)
return
yield func(i)
def last(iterable):
return list(iterable)[-1]
s = superset([0])
print(last(mapwhile(s.add, lambda x: x not in s, accumulate(cycle(data)))))
Run Code Online (Sandbox Code Playgroud)
我在匹配表达式上添加了一个条件断点,每千i分钟一次,看起来这个代码执行~100次/秒,即使一小时后也不会出现解决方案.一个荒谬的秩序大幅放缓.
let input = @"
+1
-1
"
let cycle xs = seq { while true do yield! xs …Run Code Online (Sandbox Code Playgroud)