Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法获得';家长';从导入的模块中删除模块?_Python - Fatal编程技术网

Python 有没有办法获得';家长';从导入的模块中删除模块?

Python 有没有办法获得';家长';从导入的模块中删除模块?,python,Python,我很好奇是否可以访问其他模块导入到的父模块的名称 例如,如果我有一个模块(moduleA),父模块是module,foo.py,它将被导入其中,moduleA是否可能知道foo的位置 模 福比 否。导入的模块不包含任何形式的状态,该状态存储与导入方式相关的数据 我认为更好的问题是,你为什么要这样做?您知道,如果foo.py确实是您的\uuuu main\uuuu,那么您可以很容易地从中获得名称foo.py(使用sys.argv)?如果foo.py是一个导入的模块,那么在导入时,您显然已经知道fo

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

例如,如果我有一个模块(
moduleA
),父模块是module,
foo.py
,它将被导入其中,
moduleA
是否可能知道
foo
的位置

模 福比
否。导入的模块不包含任何形式的状态,该状态存储与导入方式相关的数据

我认为更好的问题是,你为什么要这样做?您知道,如果
foo.py
确实是您的
\uuuu main\uuuu
,那么您可以很容易地从中获得名称
foo.py
(使用sys.argv)?如果
foo.py
是一个导入的模块,那么在导入时,您显然已经知道
foo.py
的名称及其位置等。

找到了它

函数中的一个小import语句可以访问模块名

模 然后,在“父”模块内部

给出:

>>> 'foo.py'

我遇到了类似的问题。您可以使用
\uuuu name\uuuuu

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

或者,如果您试图直接访问该模块(不是OP的问题,而是相关的),请参见

中的我的答案这里是我用来存储父方法名称和变量的东西,稍后将在类中使用装饰器调用

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
脚本来运行它

api_data = APIData()


results = api_data.search_list_by_keyword(
                       part='snippet',
                       maxResults=25,
                       order='date')


print(results)

resultsTwo = api_data.get_next_page()

print(resultsTwo)

一个模块可以被导入到许多其他模块中,因此没有所谓的“导入”模块。我认为他的意思是问你是否可以编写一个函数来识别导入它的文件名(从外部模块)@yuvi耶!我解释得很糟糕,但这就是我要问的。可能,是的。好主意?当然不是。如果你的要求是为了实际执行,不要。@ZackYoshyaro尝试使用内置的魔法方法获取当前文件的名称。就像在,
os.path.abspath(\uuu file\uuuu)
中一样。我敢肯定,这看起来有点复杂,但想这样做的原因是为了以一种客户机代码不需要向装饰器传递任何参数的方式装饰主函数。我找到了一个简单的解决方法(将其作为答案发布在下面)。这只是打印您正在运行的脚本的名称。这与进口无关。@IsmailBadawi很好。。这就是我的问题所在。如何获取导入另一个模块的父模块。这样就可以了。我想我只是解释了我试图完成的非常糟糕的事情/但这不是我们要做的。这是打印正在运行的脚本的名称。如果运行foo.py,它导入A,A导入B,那么
B.print\u module\u name()
将返回foo.py,而不是A。可以想象,这就是问题的解决方案。然而,这并不是你所问问题的答案。@IsmailBadawi,Ohhh。。。我明白你在说什么了。我道歉。是的,我对我的问题解释得很糟糕,看起来!对于“模块名”,我想我的意思是“调用导入函数的脚本的名称”。我需要这个答案。我试图在一个目录中的一个模块中为我的应用程序创建一个根记录器,并让该目录中的所有记录器向上传播。它不起作用,因为它的模块名太具体了,所以我需要模块的父目录。使用rsplit可以(稍微)加快代码速度,当然也可以提高可读性。不过,谁知道呢,我不会指望它在基准测试中会更快
>>> 'foo.py'
parent_name = '.'.join(__name__.split('.')[:-1])
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
api_data = APIData()


results = api_data.search_list_by_keyword(
                       part='snippet',
                       maxResults=25,
                       order='date')


print(results)

resultsTwo = api_data.get_next_page()

print(resultsTwo)