- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
免责声明:我知道我正在做的事情可能永远永远不会在真实程序中完成。
我最近刚刚了解了 python 的 types.CodeType
和 types.FunctionType
,这让我对通过这些类手动创建函数产生了兴趣。因此,作为一个小测试,我从一个看起来像这样的函数开始:
def x(e, a, b=0, *c, d=0, **f):
print(a, b, c, d, e, f)
并想看看我是否可以移动参数以将其变成这样:
def x(a, b=0, *c, d=0, e=0, **f):
print(a, b, c, d, e, f)
本质上,我想将一个普通参数变成一个仅包含关键字的参数。这是我用来做这种突变的代码:
from types import CodeType, FunctionType
def x(e, a, b=0, *c, d=0, **f):
print(a, b, c, d, e, f)
code = x.__code__
codeobj = CodeType(
code.co_argcount - 1, code.co_kwonlyargcount + 1, code.co_nlocals, code.co_stacksize,
code.co_flags, code.co_code, code.co_consts, code.co_names, ('a', 'b', 'd', 'e', 'c', 'f'),
code.co_filename, code.co_name, code.co_firstlineno, code.co_lnotab, code.co_freevars,
code.co_cellvars
)
new_func = FunctionType(codeobj, x.__globals__, x.__name__, x.__defaults__, x.__closure__)
new_func.__kwdefaults__ = {'d': 0, 'e': 0}
奇怪的是,工具提示似乎正确显示(当您开始键入函数调用时 IDLE 解释器中显示的黄色小矩形文本),它显示“a, b=0, *c, d=0 , e=0, **f”。但至少可以说该函数的行为很有趣:
>>> new_func(1)
0 0 () 0 1 {}
>>> new_func(1, 2)
2 0 () 0 1 {}
第一个参数仍然作为 e
发送,第二个元素仍然作为 a
发送。
有办法解决这个问题吗?如果存在,是否需要深入研究 code.co_code
并分解操作码,还是有更简单的方法?
最佳答案
函数和它们的代码对象是紧密耦合的。参数作为本地人提交,本地人按索引查找:
>>> import dis
>>> def x(e, a, b=0, *c, d=0, **f):
... print(a, b, c, d, e, f)
...
>>> dis.dis(x)
2 0 LOAD_GLOBAL 0 (print)
3 LOAD_FAST 1 (a)
6 LOAD_FAST 2 (b)
9 LOAD_FAST 4 (c)
12 LOAD_FAST 3 (d)
15 LOAD_FAST 0 (e)
18 LOAD_FAST 5 (f)
21 CALL_FUNCTION 6 (6 positional, 0 keyword pair)
24 POP_TOP
25 LOAD_CONST 0 (None)
28 RETURN_VALUE
注意 LOAD_FAST
字节码后的整数,它们是局部数组的索引。重新排列你的参数并没有改变那些字节码索引。
code.co_varnames
列表仅用于内省(introspection)(例如 dis
输出),将索引映射回名称,而不是相反。
你必须对字节码进行手术才能改变它;查看dis
module了解更多详情。
如果您使用的是 Python 3.4 或更新版本,则可以使用新的 dis.get_instructions()
function遍历信息丰富的 Instruction
对象序列,应该这样的手术是可行的。查找 LOAD_FAST
指令,并在生成新字节码时映射索引。
Instruction
对象(还)没有将它们转换回字节的方法;添加一个是微不足道的:
from dis import Instruction, HAVE_ARGUMENT
def to_bytes(self):
res = bytes([self.opcode])
if self.opcode >= HAVE_ARGUMENT:
res += (self.arg or 0).to_bytes(2, byteorder='little')
return res
Instruction.to_bytes = to_bytes
演示:
>>> [ins.to_bytes() for ins in dis.get_instructions(code)]
[b't\x00\x00', b'|\x01\x00', b'|\x02\x00', b'|\x04\x00', b'|\x03\x00', b'|\x00\x00', b'|\x05\x00', b'\x83\x06\x00', b'\x01', b'd\x00\x00', b'S']
>>> b''.join([ins.to_bytes() for ins in dis.get_instructions(code)]) == code.co_code
True
现在您所要做的就是将带有 .opname == 'LOAD_FAST'
的指令的 .arg
参数映射到新索引。
关于python - 直接从 Python 中的 CodeType 和 FunctionType 创建函数时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24764244/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!