10.12.20 16:40, Steven D'Aprano пише:
> On Thu, Dec 10, 2020 at 03:46:37PM +0200, Serhiy Storchaka wrote:
> 
>> Maybe it is just me, because I read the original issue. But Gregory's
>> message looks to me well organized and answering questions that were
>> asked before and possible new questions.
>>
>> Here is an example. File "foo/__init__.py" contains "class A: pass".
>>
>>>>> from foo.__init__ import A
>>>>> import foo
>>>>> isinstance(A(), foo.A)
>> False
> 
> Yes yes, I get that, and I got that from Gregory's first post. I 
> understand the consequences. They are the same consequences as from:
> 
> 
>>>> import fractions
>>>> del sys.modules['fractions']
>>>> import fractions as frac
>>>> isinstance(fractions.Fraction(), frac.Fraction)
> False
> 
> 
> Should we make a warning for this too? That's not a rhetorical question.

It could be nice if there is a simple and efficient way to do this. This
happens sometimes (mostly in tests), and more reported details would be
helpful.

> There are other ways you can get this same effect. Should we have 
> warnings for them all?
> 
>     import spam
>     ImportWarning: spam.py is a hard link to eggs.py and we
>     want to force you to read the docs to learn why this is
>     a bad idea.

Do you know how to determine the name of the target of a hard link?

> I don't think we should scold users with warnings and errors, breaking 
> their code, because it *might* be bad, or because the code looks weird. 
> Weird code is not illegal.

Agree, but in many cases the code is written in a weird way because the
author did not know about the right way. We do not scold users, we
inform them and help to fix potential error.

> Referring to a subpackage with an unusual name:
> 
>     package/__init__/__init__.py
> 
>> Since __init__ is a special name and directory __init__ conflicts with
>> file __init__.py, I do not think this is good idea.
> 
> There is no conflict between a directory called "__init__" and a file 
> called "__init__.py". Both can exist in modern file systems.
> 
>     $ ls -d __init__*
>     __init__  __init__.py
> 
> I agree that it looks ugly and is weird, but we should not prohibit code 
> just because it looks weird.
> 
> 
>> I am not even sure that it works.
> 
> Seems to work fine when I tried it:
> 
>     $ cat package/__init__.py 
>     print("importing toplevel package __init__.py")
>     $ cat package/__init__/__init__.py
>     print("importing subpackage __init__/__init__.py")
> 
> 
> And importing them:
> 
>     >>> import package.__init__
>     importing toplevel package __init__.py
>     importing subpackage __init__/__init__.py
> 
> 
> If it didn't work, I would call that a bug. "__init__.py" module files 
> are special; *directories* called "__init__" are not special, they're 
> just an ordinary name.

Now remove package/__init__/__init__.py, add package/__init__/module.py
and try to import it.
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/RADVLG6XWKBDYYYFFTFGC6J7Q3KI7WDN/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to