Re: PEP 420: Implicit Namespace Packages

Brett Cannon <[email protected]>
Newsgroups gmane.comp.python.import
Message-ID <CAP1=2W6DX+6VtOQ0ELPz7UVsjgDLT60pJmA-02EJxc1QDd0V_g@mail.gmail.com>
On Thu, May 3, 2012 at 10:48 AM, Brett Cannon <[email protected]> wrote:

>
>
> On Thu, May 3, 2012 at 2:23 AM, Nick Coghlan <[email protected]> wrote:
>
>> On Thu, May 3, 2012 at 2:37 PM, PJ Eby <[email protected]> wrote:
>> > Still, code that expects to do something with a package's __file__ is
>> > *going* to break somehow with a namespace package, so it's probably
>> better
>> > for it to break sooner rather than later.
>>
>
> I'm going to roll my replies all into this email to keep things simple.
>
> So, to the people not wanting to set __file__, that  (probably) won't fly
> because it has been documented for years that built-in modules are the only
> things that don't define __file__. Or we at least need to explain to people
> how to tell the difference in a backwards-compatible fashion (e.g.
> ``module.__name__ in sys.builtin_module_names``).
>
>
>>
>> My own preference is for markers like "<frozen>", "<namespace>" and
>> "<builtin>".
>>
>
> So I would have said that had experience with the stdlib not big me on
> this.
>

That should say "So I would have agreed with that had my experience with
the stdlib in bootstrapping importlib not caused me to disagree."

Don't try to multi-task at work while in the middle of writing an email is
the lesson there. =)

-Brett

In my situation, the trace module was checking file, and if __file__ didn't
> contain "<frozen>" or "<doctest" it would try to read it as a path, and
> then error out if it couldn't open the file. Now I updated it to
> startswith('<') and endswith('>'), but I wonder how many people made a
> similar whitelist approach. And while having __file__ to None or
> non-existent will take about the same amount of time to fix, it is less
> prone to silly whitelisting like what the trace module had.
>
>
>>
>> They're significantly nicer to deal with when dumping module state for
>> diagnostic purposes. If I get a KeyError on __file__, or an
>> AttributeError on NoneType when all I'm trying to do is display data,
>> it's annoying.
>>
>> Standardising on a pattern also opens up the possibility of doing
>> something meaningful with it in get_data() later. One of the
>> guarantees of PEP 302 if that you should be able to do this:
>>
>>  data_ref = os.path.join(__file__, relative_ref)
>>  data =  __loader__.get_data(data_ref)
>>
>> That should really only blow up in get_data(), *not* on the
>> os.path.join step. Ideally, you should also be able to do this:
>>
>>  data_ref = os.path.join(mod.__file__, relative_ref)
>>  data =  mod.__loader__.get_data(data_ref)
>>
>> I see it as being similar to the mandatory file attribute on code
>> objects - placeholders like "<stdin>" and "<string>" are a lot more
>> informative when errors occur than just using None, even though
>> neither of them is a valid filesystem path.
>>
>
> But that's because there are no other introspection options to tell where
> the module originated, unlike modules which have __loader__.
>
>
>>
>> Cheers,
>> Nick.
>>
>> --
>> Nick Coghlan   |   [email protected]   |   Brisbane, Australia
>> _______________________________________________
>> Import-SIG mailing list
>> [email protected]
>> http://mail.python.org/mailman/listinfo/import-sig
>>
>
>

_______________________________________________
Import-SIG mailing list
[email protected]
http://mail.python.org/mailman/listinfo/import-sig
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.