[Distutils] pkg_resources: import string

Ian Bicking ianb at colorstudy.com
Tue Aug 2 18:27:24 CEST 2005


Phillip J. Eby wrote:
> At 05:09 PM 8/1/2005 -0500, Ian Bicking wrote:
> 
>> I was thinking some more about WSGI configuration, and much
>> configuration involves some "import a string" routing, that looks like
>> importstring("os.path:sep") or somesuch.  But we implement it slightly
>> differently.  And maybe there could be a PEP and whatnot, but I don't
>> even know what module that would go into, and it would just have to be
>> backported for a long time anyway... but then it seemed like it would
>> fit nicely into pkg_resources, and just about anywhere I want to import
>> strings I expect pkg_resources to be around as well.
> 
> 
>     from pkg_resources import EntryPoint
> 
>     def import_string(s):
>         return EntryPoint.parse("x="+s).load(False)

OK... the error messages will be a little funny due to the appropriation 
of the functionality from a different feature.  It would be nice if this 
was a separate function.  Also, what about evaluating the text after ':' 
in the scope of the module, instead of using getattr?  Though that does 
open the possibility of security issues (which are still present with 
getattr, but an actual exploit is rather unlikely).

Relatedly, in most places where I want to use this, I now also want to 
use a entry point spec.  But I don't know what entry point specs should 
look like.  So maybe even better would be a combination of the two. 
This might look like:

def import_string(spec, group=None):
     if group is not None and ' ' in spec:
         dist, name = spec.split(None, 1)
         return load_entry_point(dist, group, name)
     return EntryPoint.parse('x='+spec).load(False)

This uses a convention of "PackageName entry_point_name", with the space 
distinguishing this from other imports.  But I think a space is a rather 
vague way to make the distinction... maybe 
"PackageName[entry_point_name]"?  Then if [ comes before any : it's a 
entry point, otherwise it's an importable string.

If that sounds good I can submit a patch that does more thorough error 
checking, and separates the importing from EntryPoint.

-- 
Ian Bicking  /  ianb at colorstudy.com  /  http://blog.ianbicking.org


More information about the Distutils-SIG mailing list