New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
__init__.py can be a directory #65983
Comments
Is this expected? It was very confusing when I cloned a repo that didn't have the __init__.py there when I had just made it, but of course git doesn't track files, only directories. I had accidentaly done mkdir instead of touch. $ mkdir pkg/__init__.py
$ touch pkg/foobar.py
$ python
Python 3.4.1 (default, May 19 2014, 17:23:49)
[GCC 4.9.0 20140507 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pkg import foobar
>>> foobar
<module 'pkg.foobar' from '/home/abraithwaite/pkg/foobar.py'>
>>> |
but of course git doesn't track *directories*, only *files*. |
It is a little weird but usually problematic. The cause that import checks for the existence of '__init__.py' but doesn't then add isfile() or isdir() check which would be unnecessary 99.9% of the time. I classify this a harmless oddity. |
I think this is related to PEP-420. $ tree pkg/
pkg/
├── foobar.py $ python3.2 -c "from pkg import foobar"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named pkg But, with Python 3.3 and newer: $ python3.3 -c "from pkg import foobar"
hello See https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages for the whatsnew entry. |
Interesting. I saw the same behavior on 2.7.7 as well: $ python2
Python 2.7.7 (default, Jun 3 2014, 01:46:20)
[GCC 4.9.0 20140521 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from pkg import foobar
>>> foobar
<module 'pkg.foobar' from 'pkg/foobar.py'>
>>> Anyways, it doesn't bother me too much. I opened a ticket because I couldn't find an already open bug about it or any reference to it on google (although the keywords aren't great for google searches). Cheers! |
See also the issue bpo-7732. |
I remember that I added an check in Python 3.2 on the file type to explicitly reject directories: + if (stat(buf, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) I wrote this change in the C code, I didn't report the change to the Python code (importlib). A huge work was also done in importlib to reduce the number of calls to stat(). So maybe a check was dropped by mistake? |
Why do we care? For the most part, Linux treats directories as files (if I do a mkdir twice, the error is "mkdir: tmp: File exists". We don't care about the other flags rwx so why should we care about d? Python should avoid adding superfluous checks when it doesn't have to.
AFAICT, it hasn't bothered anyone. |
I agree, closing. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: