我很好奇是否可以访问导入其他模块的父模块的名称。
例如,如果我有一个模块(moduleA
)且父模块是foo.py
,它将被导入到模块中,moduleA
是否可以知道foo
位于?
def print_parent_module():
os.path.asbpath(#somehow access filename of parent module)
import moduleA
print moduleA.print_parent_module()
>>> "foo.py"
答案 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语句可以提供对模块名称的访问。
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