有没有办法从导入的模块中获取“父”模块的名称?

时间:2013-09-22 20:00:53

标签: python

我很好奇是否可以访问导入其他模块的父模块的名称。

例如,如果我有一个模块(moduleA)且父模块是foo.py,它将被导入到模块中,moduleA是否可以知道foo位于?

ModuleA

def print_parent_module(): 
    os.path.asbpath(#somehow access filename of parent module) 

foo.py

import moduleA 

print moduleA.print_parent_module()
>>> "foo.py"

4 个答案:

答案 0 :(得分:3)

我遇到了类似的问题。您可以使用__name__

parent_name = '.'.join(__name__.split('.')[:-1])

或者,如果您尝试直接访问该模块(不是OP的问题,但相关),请参阅Is there a way to access parent modules in Python

中的答案

答案 1 :(得分:1)

没有。导入的模块不具有任何形式的状态,用于存储与导入方式相关的数据。

我认为更好的问题是,你为什么要这样做呢?您知道如果foo.py确实是您的__main__,那么您可以轻松地从中获取名称foo.py(通过使用sys.argv)?如果foo.py是导入的模块,那么您在导入模块时显然已经知道foo.py的名称及其位置等。

答案 2 :(得分:0)

想出来!

函数内部的一个小的import语句可以提供对模块名称的访问。

moduleA

def print_module_name():
    import sys
    return sys.argv[0]

然后,在“父”模块中

# foo.py
import os 
import moduleA

if __name__ == '__main__':
    print os.path.split(moduleA.print_module_name())[-1]

给予:

>>> 'foo.py'

答案 3 :(得分:0)

这是我用来存储父级的方法名称和变量的内容,稍后将在类中使用装饰器进行调用。

unique

脚本来运行它。

import inspect
from functools import wraps

def set_reuse_vars(method):
    @wraps(method)
    def _impl(self, *method_args, **method_kwargs):
        func_current = inspect.currentframe()
        self.recall_func = dict()
        self.recall_func['method_kwargs'] = func_current.f_locals['method_kwargs']
        self.recall_func['method_name'] = func_current.f_locals['method'].__name__
        return method(self, *method_args, **method_kwargs)
    return _impl

class APIData(object):

    def __init__(self):
        self.client = None
        self.response = None
        self.recall_func = None

    def get_next_page(self):
        # Takes a pageToken to return the next result
        get_func = getattr(self, self.recall_func['method_name'])
        self.recall_func['method_kwargs']['pageToken'] = self.response['nextPageToken']
        return get_func(**self.recall_func['method_kwargs'])

    @set_reuse_vars
    def search_list_by_keyword(self, **kwargs):

        self.response = self.client.search().list(
            **kwargs
        ).execute()

        return self.response