标签: inspect

列出命名空间包中的模块

我正在尝试让Python列出命名空间包中的所有模块.

我有以下文件结构:

cwd
|--a
|  `--ns
|     |--__init__.py
|     `--amod.py
|--b
|  `--ns
|     |--__init__.py
|     `--bmod.py
`--c
   `--ns
      |--__init__.py
      `--cmod.py
Run Code Online (Sandbox Code Playgroud)

每个都__init__.py通过以下行将它的包定义为命名空间包:

__import__('pkg_resources').declare_namespace(__name__)
Run Code Online (Sandbox Code Playgroud)

该amod模块包含一个类A,bmod包含另一个类B并cmod包含C该类.

拥有干净的环境时会发生以下情况:

>>> import inspect, sys, glob
>>> sys.path += glob.glob('*')
>>> import ns
>>> inspect.getmembers(ns, inspect.ismodule)
[]
Run Code Online (Sandbox Code Playgroud)

如您所见,未列出模块.

现在,当我手动导入模块然后再次调用inspect时:

>>> inspect.getmembers(ns, inspect.ismodule)
[('amod', <module 'ns.amod' from 'a/ns/amod.pyc'>), ('bmod', <module 'ns.bmod' from 'b/ns/bmod.pyc'>), ('cmod', <module 'ns.cmod' from 'c/ns/cmod.pyc'>)]
Run Code Online (Sandbox Code Playgroud)

现在我想要在inspect不手动导入模块的情况下调用工作,那么我该如何实现呢?

python namespaces module package inspect

8
推荐指数
0
解决办法
1104
查看次数

Python inspect.stack很慢

我只是在分析我的Python程序,看看为什么它看起来很慢.我发现它的大部分运行时间花费在inspect.stack()方法上(用于输出带模块和行号的调试消息),每次调用0.005秒.这似乎相当高; 是inspect.stack真的这种缓慢的,或可能的东西是错误与我的计划?

python introspection inspect

7
推荐指数
2
解决办法
1975
查看次数

如何使用先前堆栈中的名称打印变量参数?

我想定义一个日志函数,该函数使用消息调用,后跟一个或多个要打印的变量.所以,如下所示:

log( "Oh no, error.", x, d)
Run Code Online (Sandbox Code Playgroud)

log将被定义为sorta,如:

def log( msg, *arg):
    # Loop through arg, printing caller's variable's name and value.
Run Code Online (Sandbox Code Playgroud)

这将记录以下文件:

Oh no, error.
    x = 5
    d = { foo: "Foo", goo: "Goo" }
Run Code Online (Sandbox Code Playgroud)

这可以完成吗?我可以使用inspect打印本地和参数,但我不知道是否可以使用前一帧的变量名来迭代当前帧中的值.(locals在inspect.getargvalues(previousFrame)有名字,但是很多其他的名字了.)

python inspect

7
推荐指数
1
解决办法
130
查看次数

解压缩Python的类型注释

我试图通过使用模块中的signature()函数,基于我在一些Python函数中提供的类型注释生成一些JavaScript inspect.

当类型是一个简单的内置类时,这部分可以正常工作:

import inspect

def my_function() -> dict:
    pass

signature = inspect.signature(my_function)
signature.return_annotation is dict  # True
Run Code Online (Sandbox Code Playgroud)

虽然我不知道如何打开和检查更复杂的注释,例如:

from typing import List
import inspect

def my_function() -> List[int]:
    pass

signature = inspect.signature(my_function)
signature.return_annotation is List[int]  # False
Run Code Online (Sandbox Code Playgroud)

再次引用自定义类的类似问题:

def my_function() -> List['User']:
    pass
...
signature.return_annotation  # typing.List[_ForwardRef('User')]
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的 - 所以我可以在生成JavaScript时适当地分支:

type = signature.return_annotation... # list
member_type = signature.return_annotation... # int / 'User'
Run Code Online (Sandbox Code Playgroud)

谢谢.

python annotations type-hinting inspect python-3.x

7
推荐指数
2
解决办法
1175
查看次数

Python如何获取调用函数(不仅仅是它的名字)?

我想编写一个返回调用函数的函数:

def foo():
    return get_calling_function() #should return 'foo' function object
Run Code Online (Sandbox Code Playgroud)

网上有很多示例如何获取调用函数的名称,但没有如何获取实际对象。我想出了以下获取名称的解决方案,然后在调用函数的全局命名空间中查找它。但是,这不适用于类函数,因为您还需要类名,而且我认为还有许多其他边缘情况。

from inspect import stack
def get_calling_function():
    return stack()[2][0].f_globals[stack()[1][3]]
Run Code Online (Sandbox Code Playgroud)

那么任何建议如何或是否可以编写此函数以使其通用(在 Python 3 上,顺便说一句)?谢谢。

python function inspect python-3.x

7
推荐指数
1
解决办法
3398
查看次数

我如何找出已赋予容器哪些功能?

说我运行一个添加功能的容器,例如 --cap-add=SYS_ADMIN

有没有办法找出这个容器已经被分配了 SYS_ADMIN功能?

docker-inspect 似乎没有返回此类信息。

inspect docker

7
推荐指数
2
解决办法
1548
查看次数

反击后不能检查chrome devtools源

如果我在断点处停止我的javascript代码并尝试通过悬停检查代码的某些部分(如变量或函数),它会给出一个弹出窗口,其值如下面的屏幕截图所示:

在此输入图像描述

但是,如果我在我的代码中使用es6模板字符串,如下所示:

options.push(<option key={`traveller-age-option-${i}`}>{i}</option>);
Run Code Online (Sandbox Code Playgroud)

然后反引号字符(`)下面的整个代码变成红色,如果我将鼠标悬停在它上面 - 我无法检查任何值 - 没有任何反应 - 它被视为一个字符串

在此输入图像描述

因此,我必须手动转到控制台并键入值 - 不要悬停并查看它的值.

怎么解决这个?是否有webpack选项或某些源映射或任何chrome插件,这有助于此?

javascript debugging breakpoints inspect

7
推荐指数
1
解决办法
234
查看次数

获取 Jupyter Notebook 中定义的对象的源

通常,如果你想获取一个对象的来源,你可以通过inspect模块获取:

import inspect
inspect.getsource(MyObject)
Run Code Online (Sandbox Code Playgroud)

但是,在 Jupyter 笔记本中,这不起作用:

import inspect

class Foo:
    def __init__(self, info):
        self.info = info

a = Foo("hi")

inspect.getsource(a)
Run Code Online (Sandbox Code Playgroud)

抛出错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-048b6f0c2e9b> in <module>()
      7 a = Foo("hi")
      8 
----> 9 inspect.getsource(a)

/usr/lib/python3.6/inspect.py in getsource(object)
    963     or code object.  The source code is returned as a single string.  An
    964     OSError is raised if the source code cannot be retrieved."""
--> 965     lines, lnum = getsourcelines(object)
    966     return ''.join(lines)
    967 …
Run Code Online (Sandbox Code Playgroud)

python inspect python-3.x jupyter-notebook

7
推荐指数
2
解决办法
3148
查看次数

如何处理“inspect.getsource”的限制 - 或者如何仅获取函数的源?

我一直在使用inspectPython 标准库中的模块。

以下示例运行良好(假设inspect已导入):

def foo(x, y):
    return x - y
print(inspect.getsource(foo))
Run Code Online (Sandbox Code Playgroud)

...将打印def foo(x, y):\n return x - y\n并...

bar = lambda x, y: x / y
print(inspect.getsource(bar))
Run Code Online (Sandbox Code Playgroud)

...将打印bar = lambda x, y: x / y\n。到目前为止,一切都很好。然而,在下面的例子中事情变得有点奇怪:

print(inspect.getsource(lambda x, y: x / y))
Run Code Online (Sandbox Code Playgroud)

...将打印print(inspect.getsource(lambda x, y: x / y))并...

baz = [2, 3, lambda x, y: x / y, 5]
print(inspect.getsource(baz[2]))
Run Code Online (Sandbox Code Playgroud)

...将打印baz = [2, 3, lambda x, y: x / y, …

python inspect python-3.x

7
推荐指数
1
解决办法
2067
查看次数

如何使用检查检查 python 函数参数的默认值是否设置?

我正在尝试识别未设置默认值的函数的参数。我正在使用inspect.signature(func).parameters.value()提供函数参数列表的函数。由于我使用的是 PyCharm,因此我可以看到未设置默认值的参数的属性设置Parameter.default为inspect._empty. 我通过以下方式声明该函数:

def f(a, b=1):
    pass
Run Code Online (Sandbox Code Playgroud)

因此, 的默认a值为inspect._empty。由于inspect._empty是 一个私有属性,我认为可能有一种方法可以检查值是否为inspect._empty,但我找不到它。

python signature inspect

7
推荐指数
1
解决办法
3772
查看次数