CPython Class variable exposed to Python is altered.
Vincent Vande Vyvre
vincent.vande.vyvre at telenet.be
Wed Apr 12 05:19:51 EDT 2017
Le 12/04/17 à 10:51, Peter Otten a écrit :
> Vincent Vande Vyvre wrote:
>
>> Le 12/04/17 à 08:57, Vincent Vande Vyvre a écrit :
>>> Hi,
>>>
>>> Learning CPython, I've made this simple exercice, a module test which
>>> contains an object Test.
>>>
>>> The object Test has an attribute name, fixed at instanciation.
>>>
>>> So, I try my code with a script:
>>>
>>> -------------------------------------------
>>> from test import Test
>>>
>>> for n in ("The name", "Foo", "Spam"):
>>> t = Test(n)
>>> print("%s --> %s" %(n, t.name))
>>> -------------------------------------------
>>>
>>> And the return:
>>>
>>> Uhe name --> Uhe name
>>> Goo --> Goo
>>> Tpam --> Tpam
>>>
>>> As we can see, the first letter is changed with the next letter in
>>> alphabetical order, but not only for the attribute name, also for the
>>> reference n.
>> if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|", kwlist, &name))
>> return -1;
>>
>> if (name) {
>> tmp = self->name;
>> Py_INCREF(name);
> While I don't know how to do this properly you seem to be applying
> Py_INCREF() to a C string rather than a Python string object. C being C you
> can cast anything to anything else...
>
> Aren't there any warnings at compile time?
>
No, no warning.
For the truth, this code is copy-pasted from the doc.
https://docs.python.org/3.5//extending/newtypes.html#adding-data-and-methods-to-the-basic-example
Vincent
More information about the Python-list
mailing list