On Fri, Mar 2, 2018 at 9:49 AM, Rick Johnson
<rantingrickjohn...@gmail.com> wrote:
> On Wednesday, February 28, 2018 at 9:00:37 PM UTC-6, Chris Angelico wrote:
>> On Thu, Mar 1, 2018 at 1:46 PM, Rick Johnson
>> <rantingrickjohn...@gmail.com> wrote:
>> > On Wednesday, February 28, 2018 at 5:02:17 PM UTC-6, Chris Angelico wrote:
>> >
>> >> Here's one example: reference cycles. When do they get detected?
>> >> Taking a really simple situation:
>> >>
>> >> class Foo:
>> >>     def __init__(self):
>> >>         self.self = self
>> >
>> > *shudders*
>> >
>> > Can you provide a real world example in which you need an
>> > object which circularly references _itself_? [...]
>>
>> Not off hand, but I can provide an EXTREMELY real-world
>> example of a fairly tight loop: exceptions. An exception
>> has a reference to the local variables it came from, and
>> those locals may well include the exception itself:
>>
>> try:
>>     1/0
>> except Exception as e:
>>     print(e)
>>
>> The ZeroDivisionError has a reference to the locals, and
>> 'e' in the locals refers to that very exception object.
>
> AFAIK, Python allows access to the "locals namespace" in
> every scope, so i'm not sure how this specific case is any
> more unique than any of the innumerable other cases that
> could be presented. (but if i'm missing something, feel free
> explain)
>
> Also, i'm not convinced that a reference which is
> encapsulated by the current local namespace (even if the
> containing dict is an attribute of some object!) is the
> equivalent of `self.bar = bar`. (NOTE: i used `bar` instead
> of `self` so the comparison would be more clear)
>
>     ## Python 2.x ##
>     >>> class Foo(object):
>     ...     def __init__(self):
>     ...         self.bar = "bar"
>     ...         print locals()
>     ...
>     >>> foo = Foo()
>     {'self': <__main__.Foo object at 0x027A6890>}
>     >>> foo.__dict__
>     {'bar': 'bar'}
>
>
> So, yeah. The challenge remains: "Produce a real world
> example in which an object stores a reference of itself, and
> then provide an acceptable justification for such a thing."

The exact same example I already mentioned. Here, I'll make it
perfectly clear for you.

>>> def exc():
...     try: 1/0
...     except Exception as e: return e
...
>>> ex = exc()
>>> ex.__traceback__.tb_frame.f_globals["ex"] is ex
True

Is it real-world? Yep. EVERY SINGLE EXCEPTION has this. Acceptable
justification? Printing out tracebacks that involve objects from your
local or global scope.

Got it now?

ChrisA
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to