2
2
from io import BytesIO , StringIO , UnsupportedOperation
3
3
4
4
from django .core .files .utils import FileProxyMixin
5
+ from django .utils .functional import cached_property
5
6
6
7
7
8
class File (FileProxyMixin ):
@@ -27,7 +28,8 @@ def __bool__(self):
27
28
def __len__ (self ):
28
29
return self .size
29
30
30
- def _get_size_from_underlying_file (self ):
31
+ @cached_property
32
+ def size (self ):
31
33
if hasattr (self .file , 'size' ):
32
34
return self .file .size
33
35
if hasattr (self .file , 'name' ):
@@ -43,17 +45,6 @@ def _get_size_from_underlying_file(self):
43
45
return size
44
46
raise AttributeError ("Unable to determine the file's size." )
45
47
46
- def _get_size (self ):
47
- if hasattr (self , '_size' ):
48
- return self ._size
49
- self ._size = self ._get_size_from_underlying_file ()
50
- return self ._size
51
-
52
- def _set_size (self , size ):
53
- self ._size = size
54
-
55
- size = property (_get_size , _set_size )
56
-
57
48
def chunks (self , chunk_size = None ):
58
49
"""
59
50
Read the file and yield chunks of ``chunk_size`` bytes (defaults to
@@ -150,7 +141,7 @@ def close(self):
150
141
pass
151
142
152
143
def write (self , data ):
153
- self .__dict__ .pop ('_size ' , None ) # Clear the computed size.
144
+ self .__dict__ .pop ('size ' , None ) # Clear the computed size.
154
145
return self .file .write (data )
155
146
156
147
0 commit comments