[Tutor] Why do I not get an error when I mistakenly type "humdrum.sigh_strenght" instead of the correct "humdrum.sigh_strength"?
Cameron Simpson
cs at zip.com.au
Sat Jan 23 00:04:50 EST 2016
On 22Jan2016 22:14, boB Stepp <robertvstepp at gmail.com> wrote:
>On Thu, Jan 21, 2016 at 4:57 AM, Steven D'Aprano <steve at pearwood.info> wrote:
>> Danny is correct. And it is a useful feature too. For instance, we can
>> add attributes to functions:
>>
>> def spam(x, y):
>> ...
>>
>> spam.extra_info = "whatever"
>
>A new thing that I did not suspect I could do. This bothers me for two reasons:
>
> 1) It does not seem right adding attributes to functions outside
>of its definition.
Have you tried to do it from inside? Anyway, a function is just another object.
What do you think it should be particularly special?
> 2) spam.extra_info appears to be global:
>
>>>> spam.extra_info = "whatever"
>>>> z = 'WOW!'
>>>> def print_global_stuff():
> print('z =', z)
> print('spam.extra_info =', spam.extra_info)
No, "spam" is global. So you can name it anywhere in that module; therefore you
can name anything inside it. Again, like any other object.
>>>> print_global_stuff()
>z = WOW!
>spam.extra_info = whatever
>
>And I imagine I am being dense about something that is quite obvious
>to you: How is this a useful feature to have? What does it give me
>that is more useful than just saying something like:
>
>just_another_global variable = "whatever"
spam.extra_info = "blah"
snot = spam
print(snot.extra_info)
Consider if you passed "snot" (or "spam") to a function:
def print_extra_info(obj):
print(obj.extra_info)
This is not something you could do with just_another_global_variable.
Consider: this is information you want assicated with a specific object.
Therefore it really _is_ an arribute of the object so that it can follow it
around.
>And what bothered me about my original example that started this
>thread is that when my typo
>
>humdrum.sigh_strenght = 'high'
>
>was accepted and did not generate an error, it seemed to mean to me
>that I was violating my object's data encapsulation. It just seems to
>me that I should not be able to arbitrarily add new attributes from
>outside the class definition that created my object. That seems
>similar to having a class Dog, to which from outside the class'
>definition, I decide to add a new Dog attribute that all dogs in this
>class can now have a tail sticking out of their noses. I have no
>qualms about subclassing Dog with a MutantDog subclass, but adding new
>attributes from outside the class definition? That just does not seem
>right to at this point of my understanding. As in your function
>example, I am sure that I am missing something quite obvious, but I am
>just not seeing it now.
All you're missing is realising that setting an attribute is not a special
operation.
To take an anecdote from elsewhere:
UNIX was not designed to stop you from doing stupid things, because that
would also stop you from doing clever things. - Doug Gwyn
There's no need to prevent you setting "sigh_strenght". There probably is
benefit in linting tools reporting to you about attributes which are set but
apparently never used.
Cheers,
Cameron Simpson <cs at zip.com.au>
More information about the Tutor
mailing list