How to import PEP8 into a package

If I import a third-party module, but the syntax that they use does not match mine, is there a good way to pep8 it?

Example. I need to use a third-party module that I cannot edit, and their naming convention is not so great.

Example:

thisIsABase_function(self,a,b) 

I have code that converts the name to pep8, but I was wondering how can I make the functions available for this new pep8 name?

 def _pep8ify(name): """PEP8ify name""" import re if '.' in name: name = name[name.rfind('.') + 1:] if name[0].isdigit(): name = "level_" + name name = name.replace(".", "_") if '_' in name: return name.lower() s1 = re.sub('(.)([AZ][az]+)', r'\1_\2', name) return re.sub('([a-z0-9])([AZ])', r'\1_\2', s1).lower() 

Can I use PEP8 to import these names?

+7
python
source share
2 answers

You can use the context manager to automatically change characters from the imported module, for example:

Example:

 with Pep8Importer(): import funky 

The code:

 class Pep8Importer(object): @staticmethod def _pep8ify(name): """PEP8ify name""" import re s1 = re.sub('(.)([AZ][az]+)', r'\1_\2', name) return re.sub('([a-z0-9])([AZ])', r'\1_\2', s1).lower() def __enter__(self): # get list of current modules in namespace self.orig_names = set(dir(sys.modules[__name__])) def __exit__(self, exc_type, exc_val, exc_tb): """ Pep8ify names in any new modules Diff list of current module names in namespace. pep8ify names at the first level in those modules Ignore any other new names under the assumption that they were imported/created with the name as desired. """ if exc_type is not None: return new_names = set(dir(sys.modules[__name__])) - self.orig_names for module_name in (n for n in new_names if not n.startswith('_')): module = sys.modules[module_name] for name in dir(module): pep8ified = self._pep8ify(name) if pep8ified != name and not name.startswith('_'): setattr(module, pep8ified, getattr(module, name)) print("In mModule: {}, added '{}' from '{}'".format( module_name, pep8ified, name)) 

Security Code:

 with Pep8Importer(): import funky print(funky.thisIsABase_function) print(funky.this_is_a_base_function) 

funky.py

 thisIsABase_function = 1 

Results:

 In module: funky, added 'this_is_a_base_function' from 'thisIsABase_function' 1 1 
+6
source share

I think something like this does what you want:

 # somemodule.py def func_a(): print('hello a') def func_b(): print('hello b') # yourcode.py import inspect import importlib def pepimports(the_module_name): mymodule = importlib.import_module(the_module_name) myfuncs = inspect.getmembers(f, inspect.isfunction) for f in myfuncs: setattr(mymodule, _pep8ify(f[1].__name__) , f[1]) return mymodule mymodule = pepimports('some_module_name') # you can now call the functions from mymodule # (the original names still exist, so watch out for clashes) mymodule.pepified_function() 

This is a bit hacky, but I tried (python 3.5) and it seems to work (at least in a trivial example).

0
source share

All Articles