A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://mail.python.org/pipermail/python-dev/2012-October/122029.html below:

[Python-Dev] Should vars() return modifiable dict?

[Python-Dev] Should vars() return modifiable dict?Steven D'Aprano steve at pearwood.info
Wed Oct 3 17:34:33 CEST 2012
On 03/10/12 18:54, Serhiy Storchaka wrote:

> For locals vars() returns... hmm, partially modifiable dict:
>
>> >> def f():
> ... x = 42
> ... print(vars())
> ... vars()['x'] = 43
> ... vars()['y'] = 44
> ... print(x, vars())
> ...
>> >> f()
> {'x': 42}
> 42 {'y': 44, 'x': 42}
>
> Should behavior of vars() be corrected for locals?

I believe you are misinterpreting what you are seeing. In this case,
vars() simply returns locals(), which is an ordinary dict, but changes
to that dict are not guaranteed to propagate to the actual local
variables themselves. You make changes to that dict, then call vars()
again, which returns a fresh locals() dict. So what you are seeing is
simply a side-effect of the fact that changes to locals() may not
actually effect the local variables.

Note that in IronPython, the behaviour of your code is different:


steve at runes:~$ ipy
IronPython 2.6 Beta 2 DEBUG (2.6.0.20) on .NET 2.0.50727.1433
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
...     x = 42
...     print(vars())
...     vars()['x'] = 43
...     vars()['y'] = 44
...     print(x, vars())
...
>>> f()
{'x': 42}
(43, {'y': 44, 'x': 43})



> Should vars() for objects with __slots__ [1] returns modifiable or non-modifiable dict?
>
> [1] http://bugs.python.org/issue13290


You are assuming that the behaviour of vars(obj) should change. I don't think
that is necessarily the case.

vars(obj) is defined as returning the object __dict__ attribute. If an object
has no __dict__, vars() should (pick one):

1) Keep the current behaviour and raise an exception.

2) Return a regular dict containing {slot: value} for each of the slots.
    Since the dict is a copy, changes to the dict will not effect the
    original object.

3) Return a dictproxy containing {slot: value} for each of the slots.
    Since the dictproxy does not support item assignment, you can't
    modify it.

4) Return some other proxy object such that changes to the dict will
    also change the object's slot attributes.


I find myself unable to choose between 2) and 4), which suggests that
the status quo wins and we keep the current behaviour.



-- 
Steven
More information about the Python-Dev mailing list

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4