如何导入PEP8包

cod*_*000 7 python python-3.x

如果我从第三方导入模块,但他们使用的语法与我的排序不一致,那么pep8是否有好的方法呢?

示例:我需要使用无法编辑的第三方模块,并且它们的命名约定不是很好.

例:

thisIsABase_function(self,a,b)
Run Code Online (Sandbox Code Playgroud)

我有一些代码将pep8命名为pep8,但我想知道如何通过新的pep8名称访问这些函数?

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('(.)([A-Z][a-z]+)', r'\1_\2', name)
    return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
Run Code Online (Sandbox Code Playgroud)

有没有办法在导入时可以PEP8这些名字?

Ste*_*uch 6

您可以使用上下文管理器自动从导入的模块中获取符号,如:

例:

with Pep8Importer():
    import funky
Run Code Online (Sandbox Code Playgroud)

码:

class Pep8Importer(object):

    @staticmethod
    def _pep8ify(name):
        """PEP8ify name"""
        import re
        s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
        return re.sub('([a-z0-9])([A-Z])', 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))
Run Code Online (Sandbox Code Playgroud)

测试代码:

with Pep8Importer():
    import funky

print(funky.thisIsABase_function)
print(funky.this_is_a_base_function)
Run Code Online (Sandbox Code Playgroud)

funky.py

thisIsABase_function = 1
Run Code Online (Sandbox Code Playgroud)

结果:

In module: funky, added 'this_is_a_base_function' from 'thisIsABase_function'

1
1
Run Code Online (Sandbox Code Playgroud)


Lau*_*t S 0

我认为这样的事情可以满足你的要求:

# 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()
Run Code Online (Sandbox Code Playgroud)

这有点hackish,但我已经尝试过(python 3.5)并且它似乎有效(至少在一个简单的例子上)。