10
10
import os
11
11
import tokenize
12
12
13
- __all__ = ["getline" , "clearcache" , "checkcache" ]
13
+ __all__ = ["getline" , "clearcache" , "checkcache" , "lazycache" ]
14
14
15
- def getline (filename , lineno , module_globals = None ):
16
- lines = getlines (filename , module_globals )
17
- if 1 <= lineno <= len (lines ):
18
- return lines [lineno - 1 ]
19
- else :
20
- return ''
21
-
22
-
23
- # The cache
24
15
25
16
# The cache. Maps filenames to either a thunk which will provide source code,
26
17
# or a tuple (size, mtime, lines, fullname) once loaded.
@@ -29,9 +20,17 @@ def getline(filename, lineno, module_globals=None):
29
20
30
21
def clearcache ():
31
22
"""Clear the cache entirely."""
23
+ cache .clear ()
32
24
33
- global cache
34
- cache = {}
25
+
26
+ def getline (filename , lineno , module_globals = None ):
27
+ """Get a line for a Python source file from the cache.
28
+ Update the cache if it doesn't contain an entry for this file already."""
29
+
30
+ lines = getlines (filename , module_globals )
31
+ if 1 <= lineno <= len (lines ):
32
+ return lines [lineno - 1 ]
33
+ return ''
35
34
36
35
37
36
def getlines (filename , module_globals = None ):
@@ -56,11 +55,10 @@ def checkcache(filename=None):
56
55
57
56
if filename is None :
58
57
filenames = list (cache .keys ())
58
+ elif filename in cache :
59
+ filenames = [filename ]
59
60
else :
60
- if filename in cache :
61
- filenames = [filename ]
62
- else :
63
- return
61
+ return
64
62
65
63
for filename in filenames :
66
64
entry = cache [filename ]
@@ -109,8 +107,10 @@ def updatecache(filename, module_globals=None):
109
107
# for this module.
110
108
return []
111
109
cache [filename ] = (
112
- len (data ), None ,
113
- [line + '\n ' for line in data .splitlines ()], fullname
110
+ len (data ),
111
+ None ,
112
+ [line + '\n ' for line in data .splitlines ()],
113
+ fullname
114
114
)
115
115
return cache [filename ][2 ]
116
116
0 commit comments