- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我不知道如何使用 inspect 检查当前正在执行的函数/inspect_shell
我猜它涉及使用 getinnerframe 和 getouterframe 遍历框架层次结构,但我对几个问题感到困惑。
给定这个例子九.py:
import inspect_shell
import time
def number_nine():
x = 9
while x==9:
time.sleep(1)
number_nine()
print x
我想检查 x
的值,甚至可能更改它以使函数返回并打印新值。
首先我启动 nine.py,然后在一个单独的命令窗口中,使用 inspect_shell ,我看到 getinnerframes
在当前帧上不起作用(它需要跟踪(也许?))并且当前帧没有“跟踪”。和 getouterframes
(以防我倒过来考虑)似乎只获得与我的功能无关的帧。
>> Inspect Shell v1.0
>> https://github.com/amoffat/Inspect-Shell
localhost:1234> import inspect
localhost:1234> f = inspect.currentframe()
localhost:1234> inspect.getinnerframes(f)
Traceback (most recent call last):
File "C:\Users\Paul\Desktop\inspect_shell.py", line 143, in run_repl
try: exec compile(data, "<dummy>", "single") in f_globals, f_globals
File "<dummy>", line 1, in <module>
File "C:\Python26\lib\inspect.py", line 942, in getinnerframes
framelist.append((tb.tb_frame,) + getframeinfo(tb, context))
AttributeError: 'frame' object has no attribute 'tb_frame'
localhost:1234> dir(f)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__',
'__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'f_back', 'f_builtins',
'f_code', 'f_exc_traceback', 'f_exc_type', 'f_exc_value', 'f_glo
bals', 'f_lasti', 'f_lineno', 'f_locals', 'f_restricted', 'f_trace']
localhost:1234> print f.f_trace
None
localhost:1234> inspect.getouterframes(f)
[(<frame object at 0x0237D470>, '<dummy>', 1, '<module>', None, None),
(<frame object at 0x02375938>, 'C:\\Users\\Paul\\Desktop\\inspect_shell.py', 14
3, 'run_repl', [' try: exec compile(data, "<dummy>", "single") in
f_globals, f_globals\n'], 0), (<frame object at 0x023A2C30>, 'C:\
\Python26\\lib\\threading.py', 484, 'run',
[' self.__target(*self.__args, **self.__kwargs)\n'], 0),
(<frame object at 0x02397F28>, 'C:\
\Python26\\lib\\threading.py', 532, '__bootstrap_inner',
[' self.run()\n'], 0), (<frame object at 0x023A9D68>,
'C:\\Python26\\lib\\thre
ading.py', 504, '__bootstrap', [' self.__bootstrap_inner()\n'], 0)]
最佳答案
这有点棘手,但鉴于源代码(或一个好的 python 反编译器),您可以这样做:
在'nine.py'中:
def number_nine():
x = 9
if x == 9:
print 'x is Nine!'
else:
print 'x:', x
你的恶意代码:
from nine import number_nine
我们需要用到ast,即Abstract Syntax Trees :
import inspect
import ast
现在我们获取源并将其转换为 ast:
# Assuming you have the source, we can generate AST from it
nine_src = inspect.getsource(number_nine)
nine_ast = ast.parse(nine_src)
隔离要更改的特定语句:
# This is the Assign object, which represents the 'x = 9' line
# Try to run it interactivly and see how it looks...
x_assign = nine_ast.body[0].body[0]
# Prints 'x'
print x_assign.targets[0].id
# Prints 9
print x_assign.value.n
并根据需要修改它:
# Change the value of x
# Notice, that we change the assignment itself, a.k.a `x = 9` is now `x = "It's a trap!"`
x_assign.value.n = "It's a trap!"
现在剩下要做的就是将修改后的 ast 对象编译成更有用的东西:
# Compile the new function
new_nine = compile(nine_ast, 'new_nine', 'exec')
您可以使用简单的 exec
(如果它在 globals
中,它将替换 'number_nine'),或 exec in
,并将其放置在临时模块中:
# Now we need to execute our litle new_nine (which is a code object)
# This to create the modified version in 'm'
import types
m = types.ModuleType('m', 'The m module')
exec new_nine in m.__dict__
m.number_nine()
# Or this to create it in the global scope
exec new_nine
number_nine()
砰!它打印 x: It's a trap!
关于python - 使用 python inspect 查看函数中的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8732092/
我有一个嵌套数组: array_name = [ ["Alice", "pizza", "soccer"], ["Steve", "sushi", "hockey"], ["Alex",
我正在尝试下载网页,但文件在我下载的内容、页面源和检查方面有所不同。如何下载检查中显示的内容? 最佳答案 查看页面源代码返回服务器发送并由浏览器加载的静态 html 页面。 虽然 inspect 将显
我发现自己在我的功能测试中做了很多 puts .inpsect s 以确保我知道数据是如何格式化的......但是当散列对象中的每个条目之后没有新行时散列很难读取.无论如何,也许是一个 gem ?,
所以这段代码: from inspect import * class X(object): def y(self): pass methods = getmembers(X, predi
我在 Ruby 1.9 中通过调用等于 my_hash.inspect 的 my_hash.to_s 不小心将 Ruby 哈希保存到字符串。这给了我这样的字符串: '{"foo"=>{"bar"=>"
自从升级 NodeJs 以来,我从 Visual Studio 2017 运行 Nodejs 时遇到此错误。 断点也不起作用。有任何解决这个问题的方法吗? 注意:VS版本是15.5.6NodeJS 版
我已经使用 VS 2015 在我的计算机上安装了 nodeJs 并进行了设置。当我尝试运行示例 hello world 应用程序时,它抛出以下错误: verb(node:14096) [DEP0062
当我在 Visual Studio 中运行 Node.js 应用程序时,我收到以下消息:DeprecationWarning: 'node --debug' 和 'node --debug-brk'
下面的代码无法运行 def map = [name:"Test :: ( %2f %25 \$ * & ! @ # ^)"] String s = map.inspect() println Eval
我正在尝试使用检查来查明 foo 是否是对象 test_me 的方法。我希望它返回 True 或 False。这是我试过的。 import inspect class Object: pass
这个问题在这里已经有了答案: Is there a way in git to obtain a push date for a given commit? (8 个答案) 关闭 5 年前。 我如何
描述与简介 docker inspect是docker客户端的原生命令,用于查看docker对象的底层基础信息。包括容器的id、创建时间、运行状态、启动参数、目录挂载、网路配置等等。另外,该命令也
我的问题是如何使 SASS 函数 inspect() 与数组一起工作或如何以另一种方式输出数组。 我的基本示例是这段代码: @function z($layers...) { @warn "`#{
我在 Ruby 中发现了一个奇怪的问题,我不太确定这是一个问题还是最近 Ruby 版本中引入的一个功能。 基本上当我们调用一个未定义的方法时,我们会得到一个 undefined method Ruby
Message will display here Document.getElementById("idbd").style.backgroundcolor="red"; Document
注意:我读过类似的帖子,但没有一个完全是我的问题 - 我可以右键单击它,然后它就消失了。 我发现“检查元素”是 Chrome 中非常宝贵的工具,但是我在将其用作导航栏上某个元素的子菜单时遇到了麻烦,该
使用 ionic 开发 Web 应用程序时,在 iOS 模拟器中使用命令行运行程序非常有用 ionic run ios -l -c -s --target="iPhone-5s" 然后通过选择桌面 S
JQuery 是一个非常强大的工具,但它很难调试。 看看下面的图片: 如何轻松找到包含 JQuery 代码的 *.js 文件,该代码已附加到这部分 HTML 代码? 我认为这几乎是不可能的,因为它也可
我正在尝试通过古腾堡 Inspect Control 的媒体库上传文件。我目前在 JS 中使用此代码: var el = wp.element.createElement, registerB
我正在尝试使用 Is it possible to list all functions in a module? 的答案列出一系列模块中的功能。但在我的解释器中,我得到如下信息: Python 3.
我是一名优秀的程序员,十分优秀!