@@ -196,10 +196,14 @@ reveal_type(c.attr) # revealed: Unknown
196196
197197## Behind the scenes
198198
199+ > TODO: This test is currently disabled pending [ an upstream Salsa
200+ > fix] ( https://github.com/salsa-rs/salsa/pull/741 ) . Once that has been merged, re-enable this test
201+ > by changing the language codes below back to ` py ` .
202+
199203In this section, we trace through some of the steps that make properties work. We start with a
200204simple class ` C ` and a property ` attr ` :
201205
202- ``` py
206+ ``` ignore
203207class C:
204208 def __init__(self):
205209 self._attr: int = 0
@@ -216,7 +220,7 @@ class C:
216220Next, we create an instance of ` C ` . As we have seen above, accessing ` attr ` on the instance will
217221return an ` int ` :
218222
219- ``` py
223+ ``` ignore
220224c = C()
221225
222226reveal_type(c.attr) # revealed: int
@@ -226,7 +230,7 @@ Behind the scenes, when we write `c.attr`, the first thing that happens is that
226230up the symbol ` attr ` on the meta-type of ` c ` , i.e. the class ` C ` . We can emulate this static lookup
227231using ` inspect.getattr_static ` , to see that ` attr ` is actually an instance of the ` property ` class:
228232
229- ``` py
233+ ``` ignore
230234from inspect import getattr_static
231235
232236attr_property = getattr_static(C, "attr")
@@ -237,7 +241,7 @@ The `property` class has a `__get__` method, which makes it a descriptor. It als
237241method, which means that it is a * data* descriptor (if there is no setter, ` __set__ ` is still
238242available but yields an ` AttributeError ` at runtime).
239243
240- ``` py
244+ ``` ignore
241245reveal_type(type(attr_property).__get__) # revealed: <wrapper-descriptor `__get__` of `property` objects>
242246reveal_type(type(attr_property).__set__) # revealed: <wrapper-descriptor `__set__` of `property` objects>
243247```
@@ -246,22 +250,22 @@ When we access `c.attr`, the `__get__` method of the `property` class is called,
246250property object itself as the first argument, and the class instance ` c ` as the second argument. The
247251third argument is the "owner" which can be set to ` None ` or to ` C ` in this case:
248252
249- ``` py
253+ ``` ignore
250254reveal_type(type(attr_property).__get__(attr_property, c, C)) # revealed: int
251255reveal_type(type(attr_property).__get__(attr_property, c, None)) # revealed: int
252256```
253257
254258Alternatively, the above can also be written as a method call:
255259
256- ``` py
260+ ``` ignore
257261reveal_type(attr_property.__get__(c, C)) # revealed: int
258262```
259263
260264When we access ` attr ` on the class itself, the descriptor protocol is also invoked, but the instance
261265argument is set to ` None ` . When ` instance ` is ` None ` , the call to ` property.__get__ ` returns the
262266property instance itself. So the following expressions are all equivalent
263267
264- ``` py
268+ ``` ignore
265269reveal_type(attr_property) # revealed: property
266270reveal_type(C.attr) # revealed: property
267271reveal_type(attr_property.__get__(None, C)) # revealed: property
@@ -271,7 +275,7 @@ reveal_type(type(attr_property).__get__(attr_property, None, C)) # revealed: pr
271275When we set the property using ` c.attr = "a" ` , the ` __set__ ` method of the property class is called.
272276This attribute access desugars to
273277
274- ``` py
278+ ``` ignore
275279type(attr_property).__set__(attr_property, c, "a")
276280
277281# error: [call-non-callable] "Call of wrapper descriptor `property.__set__` failed: calling the setter failed"
@@ -280,7 +284,7 @@ type(attr_property).__set__(attr_property, c, 1)
280284
281285which is also equivalent to the following expressions:
282286
283- ``` py
287+ ``` ignore
284288attr_property.__set__(c, "a")
285289# error: [call-non-callable]
286290attr_property.__set__(c, 1)
@@ -293,7 +297,7 @@ C.attr.__set__(c, 1)
293297Properties also have ` fget ` and ` fset ` attributes that can be used to retrieve the original getter
294298and setter functions, respectively.
295299
296- ``` py
300+ ``` ignore
297301reveal_type(attr_property.fget) # revealed: Literal[attr]
298302reveal_type(attr_property.fget(c)) # revealed: int
299303
0 commit comments