我正在尝试让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程序,看看为什么它看起来很慢.我发现它的大部分运行时间花费在inspect.stack()方法上(用于输出带模块和行号的调试消息),每次调用0.005秒.这似乎相当高; 是inspect.stack真的这种缓慢的,或可能的东西是错误与我的计划?
我想定义一个日志函数,该函数使用消息调用,后跟一个或多个要打印的变量.所以,如下所示:
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)有名字,但是很多其他的名字了.)
我试图通过使用模块中的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)
谢谢.
我想编写一个返回调用函数的函数:
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 上,顺便说一句)?谢谢。
说我运行一个添加功能的容器,例如 --cap-add=SYS_ADMIN
有没有办法找出这个容器已经被分配了 SYS_ADMIN功能?
docker-inspect 似乎没有返回此类信息。
如果我在断点处停止我的javascript代码并尝试通过悬停检查代码的某些部分(如变量或函数),它会给出一个弹出窗口,其值如下面的屏幕截图所示:
但是,如果我在我的代码中使用es6模板字符串,如下所示:
options.push(<option key={`traveller-age-option-${i}`}>{i}</option>);
Run Code Online (Sandbox Code Playgroud)
然后反引号字符(`)下面的整个代码变成红色,如果我将鼠标悬停在它上面 - 我无法检查任何值 - 没有任何反应 - 它被视为一个字符串
因此,我必须手动转到控制台并键入值 - 不要悬停并查看它的值.
怎么解决这个?是否有webpack选项或某些源映射或任何chrome插件,这有助于此?
通常,如果你想获取一个对象的来源,你可以通过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) 我一直在使用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, …
我正在尝试识别未设置默认值的函数的参数。我正在使用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,但我找不到它。
inspect ×10
python ×8
python-3.x ×4
annotations ×1
breakpoints ×1
debugging ×1
docker ×1
function ×1
javascript ×1
module ×1
namespaces ×1
package ×1
signature ×1
type-hinting ×1