Hi Stefan,

On Wed, 27 Jul 2016, Stefan Behnel wrote:

I wonder if we shouldn't consider the module init function a special
(enough) case here that is never performance critical, and just always
generate a frame for it. Later frame lookups would then still fail (so we'd
create somewhat of an inconsistency), but the case above looks like a
legitimate use case, and namedtuples are often (I guess in *most* cases)
created at module init time.

I created a ticket.

https://github.com/cython/cython/issues/536

Thank you very much for the insightful analysis, makes total sense!

I agree that creating a frame for the init function sounds like a most reasonable solution, the only drawback that I can see is the inconsistency you mentioned, but apparently that's as good as it gets...

As a work-around, I could only come up with a hack. You could create a Python module, import and call into it from your Cython module, create the namedtuple in Python, and then fix the __module__ reference of the namedtuple class after the fact. Although I wonder when the insertion into the module namespace happens. I couldn't find it on a quick look.

Now that you've explained the root cause, I believe that there is a less disgusting workaround one could possibly go for, what do you think?

    class PyTest(namedtuple('Test', 'test')):
        pass

--
Sincerely yours,
Yury V. Zaytsev
_______________________________________________
cython-devel mailing list
cython-devel@python.org
https://mail.python.org/mailman/listinfo/cython-devel

Reply via email to