im区块链钱包下载|dis

作者: im区块链钱包下载
2024-03-07 18:13:38

DIS中文(简体)翻译:剑桥词典

DIS中文(简体)翻译:剑桥词典

词典

翻译

语法

同义词词典

+Plus

剑桥词典+Plus

Shop

剑桥词典+Plus

我的主页

+Plus 帮助

退出

剑桥词典+Plus

我的主页

+Plus 帮助

退出

登录

/

注册

中文 (简体)

查找

查找

英语-中文(简体)

dis 在英语-中文(简体)词典中的翻译

disverb [ T ] US slang uk

Your browser doesn't support HTML5 audio

/dɪs/ us

Your browser doesn't support HTML5 audio

/dɪs/ -ss-

Add to word list

Add to word list

→ 

diss US slang

(同diss)

dis-prefix uk

Your browser doesn't support HTML5 audio

/dɪs-/ us

Your browser doesn't support HTML5 audio

/dɪs-/

added to the front of some words to form their opposites

(加在某些词语前表示相反的意思)

to disagree

不同意

a dishonest person

不诚实的人

比较

in-

non-

un-

(dis在剑桥英语-中文(简体)词典的翻译 © Cambridge University Press)

B1

dis的翻译

中文(繁体)

(同diss), (加在某些詞語前表示相反的意思)…

查看更多内容

西班牙语

faltar el respeto a, des-, in-…

查看更多内容

需要一个翻译器吗?

获得快速、免费的翻译!

翻译器工具

dis的发音是什么?

在英语词典中查看 dis 的释义

浏览

dirty tricks

dirty weekend

dirty word

dirty your hands idiom

dis

disability

disability living allowance

disable

disabled

dis更多的中文(简体)翻译

全部

dis, at diss

查看全部意思»

“每日一词”

veggie burger

UK

Your browser doesn't support HTML5 audio

/ˈvedʒ.i ˌbɜː.ɡər/

US

Your browser doesn't support HTML5 audio

/ˈvedʒ.i ˌbɝː.ɡɚ/

a type of food similar to a hamburger but made without meat, by pressing together small pieces of vegetables, seeds, etc. into a flat, round shape

关于这个

博客

Forget doing it or forget to do it? Avoiding common mistakes with verb patterns (2)

March 06, 2024

查看更多

新词

stochastic parrot

March 04, 2024

查看更多

已添加至 list

回到页面顶端

内容

英语-中文(简体)翻译

©剑桥大学出版社与评估2024

学习

学习

学习

新词

帮助

纸质书出版

Word of the Year 2021

Word of the Year 2022

Word of the Year 2023

开发

开发

开发

词典API

双击查看

搜索Widgets

执照数据

关于

关于

关于

无障碍阅读

剑桥英语教学

剑桥大学出版社与评估

授权管理

Cookies与隐私保护

语料库

使用条款

京ICP备14002226号-2

©剑桥大学出版社与评估2024

剑桥词典+Plus

我的主页

+Plus 帮助

退出

词典

定义

清晰解释自然的书面和口头英语

英语

学习词典

基础英式英语

基础美式英语

翻译

点击箭头改变翻译方向。

双语词典

英语-中文(简体)

Chinese (Simplified)–English

英语-中文(繁体)

Chinese (Traditional)–English

英语-荷兰语

荷兰语-英语

英语-法语

法语-英语

英语-德语

德语-英语

英语-印尼语

印尼语-英语

英语-意大利语

意大利语-英语

英语-日语

日语-英语

英语-挪威语

挪威语-英语

英语-波兰语

波兰语-英语

英语-葡萄牙语

葡萄牙语-英语

英语-西班牙语

西班牙语-英语

English–Swedish

Swedish–English

半双语词典

英语-阿拉伯语

英语-孟加拉语

英语-加泰罗尼亚语

英语-捷克语

英语-丹麦语

English–Gujarati

英语-印地语

英语-韩语

英语-马来语

英语-马拉地语

英语-俄语

English–Tamil

English–Telugu

英语-泰语

英语-土耳其语

英语-乌克兰语

English–Urdu

英语-越南语

翻译

语法

同义词词典

Pronunciation

剑桥词典+Plus

Shop

剑桥词典+Plus

我的主页

+Plus 帮助

退出

登录 /

注册

中文 (简体)  

Change

English (UK)

English (US)

Español

Русский

Português

Deutsch

Français

Italiano

中文 (简体)

正體中文 (繁體)

Polski

한국어

Türkçe

日本語

Tiếng Việt

हिंदी

தமிழ்

తెలుగు

关注我们

选择一本词典

最近的词和建议

定义

清晰解释自然的书面和口头英语

英语

学习词典

基础英式英语

基础美式英语

语法与同义词词典

对自然书面和口头英语用法的解释

英语语法

同义词词典

Pronunciation

British and American pronunciations with audio

English Pronunciation

翻译

点击箭头改变翻译方向。

双语词典

英语-中文(简体)

Chinese (Simplified)–English

英语-中文(繁体)

Chinese (Traditional)–English

英语-荷兰语

荷兰语-英语

英语-法语

法语-英语

英语-德语

德语-英语

英语-印尼语

印尼语-英语

英语-意大利语

意大利语-英语

英语-日语

日语-英语

英语-挪威语

挪威语-英语

英语-波兰语

波兰语-英语

英语-葡萄牙语

葡萄牙语-英语

英语-西班牙语

西班牙语-英语

English–Swedish

Swedish–English

半双语词典

英语-阿拉伯语

英语-孟加拉语

英语-加泰罗尼亚语

英语-捷克语

英语-丹麦语

English–Gujarati

英语-印地语

英语-韩语

英语-马来语

英语-马拉地语

英语-俄语

English–Tamil

English–Telugu

英语-泰语

英语-土耳其语

英语-乌克兰语

English–Urdu

英语-越南语

词典+Plus

词汇表

选择语言

中文 (简体)  

English (UK)

English (US)

Español

Русский

Português

Deutsch

Français

Italiano

正體中文 (繁體)

Polski

한국어

Türkçe

日本語

Tiếng Việt

हिंदी

தமிழ்

తెలుగు

内容

英语-中文(简体) 

 VerbPrefix

Translations

语法

所有翻译

我的词汇表

把dis添加到下面的一个词汇表中,或者创建一个新词汇表。

更多词汇表

前往词汇表

对该例句有想法吗?

例句中的单词与输入词条不匹配。

该例句含有令人反感的内容。

取消

提交

例句中的单词与输入词条不匹配。

该例句含有令人反感的内容。

取消

提交

词根词缀第5天:常见的dis - 知乎

词根词缀第5天:常见的dis - 知乎首发于看美剧学英语切换模式写文章登录/注册词根词缀第5天:常见的dis魏老师帮求职​深圳市帮帮留学服务有限公司 法定代表人欢迎关注我的“硅谷帮”公众号,专属美国华人的组织。每天学会一个词根或词缀,就能轻松背会一堆新单词。大家好,我是硅谷帮帮主今天有个感悟分享给大家:我们通过词根词缀理解单词的时候,理解的是单词的灵魂,不要拘泥于单词对应那几个中文翻译,中文博大精深,一个意思可以有10000个词汇来表达意思的。今天讲一个词缀:disdis 是个很常见的前缀,它原是副词性的拉丁前缀,意思为apart。当它作为原生前缀与拉丁词根结合时,根据词根首字母的情况,分别使用dis-,dif-,di-三种形式。其中,dis-主要出现在c,p,r,s,t等字母前面;而di-则出现在l,m,r,v等字母前面,其中又出现在它的v前面最为常见。自15世纪以来,dis-成为英国中的一个活性词缀,能与英语中的外来借词或本族语单词相缀合,表示否定的意思。它的缀合对象可以是动词、名词或形容词。当与动词缀合时,dis的意思相当于to undo 或not;当与名词相缀合时,其意思相当 于lack of ( 这时不改变名词词性)或to remove 当它与形容词结合时,意思相当于not ,在个别情况下 ,作to make not 解(这时生成的是动词)。总结下就是:dis一般有两种意思:其一是apart:分开,其二是not:非,不是,没有。自己可以多体会下这种感觉,下面就跟着帮主我一起学习相关的单词吧!分开的感觉没有,拒绝的感觉dis:意思为“分开“的相关单词1、disrupt:[动词]分裂,瓦解单词逻辑:dis(=apart:分开)+rupt(=break:破坏),这个单词的两个部分都是“分开,破坏”的感觉,和在一起自然就是“分裂”的意思;2、distract:[动词]分散(注意力),引开,分心单词逻辑:dis(=apart:分开)+tract(=draw:牵引),首先要记住tract是一种“牵引,拉”的感觉,和在一起就是:“分开往不同的方向拉”这种感觉,那就是“分散注意力”意思,也可以用来表达“引开敌人”这种感觉。我们通过词根词缀理解单词的时候,理解的是单词的灵魂,不要拘泥于单词对应那几个中文翻译,中文博大精深,一个意思可以有10000个词汇来表达意思的。就像这个distract,你不要就记住distract就等于“分散(注意力),引开,分心”,要感受这种分开牵引,往不同方向拉的感觉dis:意思为“没有,非,不是“的相关单词1、disagree:[动词]不同意单词逻辑:dis(=not:不)+agree(同意),非常好理解,agree本来就是一个单词,和在一起就是:不同意。你可以按照这个逻辑在任何一个单词前面加dis来表达反对的意思,只是很多单词直接加dis是不存在的,但是你要是真的强行任性且调皮的组合出来,并且在美国人面前说了这个“自创新词”,其实美国人也能理解你想表达的意思,只是心里会想:嗯,听外国人说英语就是好玩...2、disadvantage:[名词]不利单词逻辑:dis(=not:没有)+advantage(好处),有一个短语是:take advantage of:是利用xxx的意思。和在一起就是不利。3、disorder:[名词]混乱单词逻辑:dis(=not:没有)+order(秩序,地位),没有秩序就是混乱4、dishonour[名词]耻辱单词逻辑:dis(=not:没有)+honour(荣誉),没有荣誉就是耻辱5、disarm[动词]缴械单词逻辑:dis(=not:没有)+arm(武器),让没有武器就是缴械6、dishonest[形容词]不诚实的单词逻辑:dis(=not:没有)+honest(真诚)7、disloyal[形容词]不忠诚的单词逻辑:dis(=not:没有)+loyal(忠诚的)8、dissimilar[形容词]不相似的单词逻辑:dis(=not:没有)+similar(相似的)9、disappear[动词]消失单词逻辑:dis(=not:没有)+appear(出现)最后一部分,我们看下dis的一个变体的使用:di-和dif-,意思主要还是:“分开”的感觉,相关单词如下:1、differ :[动词]不同 ,相异单词逻辑:dif(=apart:分开)+fer(=carry:拿):不同的东西分开拿,我们最常见到的就是different和difference,中国人好像刚开始学英语的时候就会死记硬背这两个单词。2、diffuse:[动词]使散开,使扩散单词逻辑:dif(=apart:分开)+fuse(倾倒),fuse本身就是一个单词,fuse的感觉是融化,熔断的这种感觉,看到fuse仿佛就看到了岩浆般的溶液。溶液分散倒出来的感觉就是diffuse的感觉:扩散。来感受下太阳光发散的感觉例句:The sun diffuses light and heat. 太阳散发出光和热。3、dilate:[名词] 膨胀;扩大单词逻辑:di(=apart:分开)+late(=widen:加宽)不仅仅要加宽,还要把加宽再分开,是不是有点膨胀了?4、divert:[动词]转向,转移单词逻辑:di(= apart:分开)+vert(= to turn 转)5、divide:[动词]分,划分单词逻辑:di(= apart 开)+ vid (= to separate 分)例句:A brook divides the field. 一条河把田野分成两部分。发布于 2019-12-15 12:48词根词缀英语词根词根​赞同 57​​5 条评论​分享​喜欢​收藏​申请转载​文章被以下专栏收录看美剧学英语通过美剧场景把单词记到骨

迪士尼(DIS)股票股价_股价行情_财报_数据报告 - 雪球

DIS)股票股价_股价行情_财报_数据报告 - 雪球首页行情行情中心筛选器新股上市买什么交易A股交易基金交易私募中心下载App扫一扫,下载登录/注册公司概况公司简介公司高管内部持股所属指数股票交易盘前交易盘后交易历史价格期权交易空仓数据内部交易市场预期财报公告SEC文件财报公告(中)财报公告(英)电话会议实录财务数据主要指标分红派息利润表资产负债表现金流量表雪球选股器研究分析收益预估评级变化研究报告APP专享大盘异动股价提醒购买指数相关ETF扫码下载雪球App查看详情迪士尼(NYSE:DIS)可融资可卖空$110.06-2.81 -2.49% 8.05 万球友关注盘前交易 03-06 16:10:00 美东时间盘前交易110.00-0.06-0.05%最高:113.30今开:113.08成交量:1474.39万股换手:0.80%最低:109.25昨收:112.87成交额:16.30亿振幅:3.59%52周最高:115.19量比:1.31市盈率(TTM):67.61市净率:2.0052周最低:78.73委比:88.89%市盈率(静):85.76市销率:2.28每股收益:1.63股息(TTM):0.30每手股数:1总市值:2018.83亿每股净资产:54.92股息率(TTM):0.27%最小价差:0.01总股本:18.34亿机构持股:--Beta:--空头回补天数:--货币单位:USD分时五日日K周K月K季K年K120分60分30分15分5分1分区间统计全屏显示股票对比前复权前复权后复权不复权MABOLL成交量MACDKDJPEPSPCF总市值WRRSIBIASCCIPSY近1月近3月近6月近1年近3年近5年今年以来上市以来-简介华特迪士尼公司在特拉华州注册成立。华特迪士尼公司及其子公司是一家多元化的全球娱乐公司,经营以下业务:媒体网络;公园、体验和产品;工作室娱乐;以及直接面向消费者和国际(DTCI)。2020年10月,公司宣布对其媒体和娱乐业务进行战略重组,以加快其直接面向消费者(DTC)战略的增长。媒体网络、工作室娱乐和DTCI部门的运营被重组为四个组:三个内容组(工作室、通用娱乐和体育),专注于开发和制作将在其所有传统和DTC平台上使用的内容,该公司专注于这些平台的发行和商业化活动,并对全球媒体和娱乐运营结果负全部责任。公司网站:http://www.disney.com公司地址:500 South Buena Vista Street

Burbank

California 91521公司电话:1-818-5601000收起华特迪士尼公司在特拉华州注册成立。华特迪士尼公司及其子公司是一家多元化的全球娱乐公司,经营以下业务:媒体网络;公园、体验和产品;工...展开业务销售娱乐产品与服务以及发行电影及电视节目

什么是DIS?_数据接入服务 DIS_常见问题_一般性问题

什么是DIS?_数据接入服务 DIS_常见问题_一般性问题

检测到您已登录华为云国际站账号,为了您更好的体验,建议您访问国际站服务网站 https://www.huaweicloud.com/intl/zh-cn 不再显示此消息 中国站 中国站 简体中文 International English Bahasa Indonesia Español Português Türkçe عربي ไทย 简体中文 日本語 Europe English Deutsch Español Français 华为云App 活动 产品 解决方案 定价 云商店 合作伙伴 开发者 支持与服务 了解华为云 清空最近搜索 热门搜索 云耀云服务器L实例 免费试用 云服务器 域名 云速建站 “”的所有结果 文档 备案 控制台 账号中心 费用与成本 待支付订单 待续费产品 未读消息 工单管理 管理控制台 注册 登录 登录 注册 购物车 admin 帐号中心 未实名认证 已实名认证 费用与成本 待支付订单0 待续费产品0 未读消息0 伙伴中心 云商店买家中心 云商店卖家中心 工单管理 开发者个人中心 个性化推荐管理 管理控制台 admin 退出登录 取消 清空最近搜索 热门搜索 云耀云服务器L实例 免费试用 云服务器 域名 云速建站

文档首页>

数据接入服务 DIS>

常见问题>

一般性问题>

什么是DIS?

更新时间:2021-03-18 GMT+08:00

查看PDF

分享

微博

分享文档到微博

微信

扫码分享文档

复制链接

复制链接到剪贴板

链接复制成功!

什么是DIS?

数据接入服务(Data Ingestion Service)为处理或分析流数据的自定义应用程序构建数据流管道,主要解决云服务外的数据实时传输到云服务内的问题。数据接入服务每小时可从数十万种数据源(如IoT数据采集、日志和定位追踪事件、网站点击流、社交媒体源等)中连续捕获、传送和存储数TB数据。

数据流向

DIS实时从多种数据源采集数据。

DIS连续传输数据,自动将数据传输至MRS,DLI,DWS和OBS等服务做计算,分析和存储。

图1 数据流向

父主题: 一般性问题

分享:

查看PDF

查看PDF

微博

分享文档到微博

微信

扫码分享文档

复制链接

复制链接到剪贴板

一般性问题

所有常见问题

什么是DIS?

什么是分区?

DIS主要应用于哪些场景?

DIS有哪些特点和优势?

DIS有哪些模块及各模块功能?

如何开通DIS通道?

数据存储在DIS和转储其他资源有什么区别?

如何校验软件包完整性?

DIS如何发送和接收数据?

如何专线接入DIS

读取通道数据时,如何区分不同类型数据?

什么是流控?

DIS对接EPS鉴权后,进入通道列表页面看不见之前创建的通道?

意见反馈

文档内容是否对您有帮助?

有帮助

没帮助

提供反馈

提交成功!非常感谢您的反馈,我们会继续努力做到更好!

您可在我的云声建议查看反馈及问题处理状态。

系统繁忙,请稍后重试

在使用文档中是否遇到以下问题

内容与产品页面不一致

内容不易理解

缺失示例代码

步骤不可操作

搜不到想要的内容

缺少最佳实践

意见反馈(选填)

0/500

请至少选择一项反馈信息并填写问题反馈

字符长度不能超过500

直接提交

取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问

more

7*24 多渠道服务支持 备案 提供免费备案服务 专业服务 云业务全流程支持 退订 享无忧退订服务 建议反馈 优化改进建议 热门产品 云服务器 云速邮箱 域名注册 云速建站 华为云App 售前咨询热线 950808转1 技术服务咨询 售前咨询 sales@huaweicloud.com 备案服务 beian@huaweicloud.com 云商店咨询 partner@huaweicloud.com 下载华为云App 关注我们 关注华为云 4000 955 988 950808 华为云微信 扫描二维码 华为云微博 扫描二维码 华为云App 扫描下载华为云App 售前咨询:950808转1 法律声明 隐私政策 长按/截图保存,微信识别二维码或者关注公众号“华为云” 关于华为云 了解华为云 客户案例 信任中心 法律协议 新闻报道 华为云直播 热门产品 免费体验中心 云服务器 盘古大模型 SSL证书 华为云WeLink 云速建站 支持与服务 自助服务 服务公告 支持计划 智能客服 联系我们 举报中心 实用工具 文字识别 漏洞扫描 域名注册 华为云会议 定制建站 云服务健康看板 友情链接 华为官网 华为消费者业务 华为开发者联盟 华为企业业务 华为商城 黄大年茶思屋 法律声明 隐私政策 ©2024 Huaweicloud.com 版权所有 黔ICP备20004760号-14 苏B2-20130048号 A2.B1.B2-20070312 域名注册服务机构许可:黔D3-20230001 代理域名注册服务机构:新网、西数 电子营业执照 贵公网安备 52990002000093号

DIS(数字系统)_百度百科

数字系统)_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心DIS是一个多义词,请在下列义项上选择浏览(共5个义项)添加义项收藏查看我的收藏0有用+10DIS播报讨论上传视频数字系统本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!"DIS" 是英文"Digital Information System"的缩写。在物理学中有很多物理量,如距离、位移、力、速度、温度、压强、电压、电流、等,都可以用DIS进行测量。外文名DIS英文全称Digital Information System目录1释义2应用释义播报编辑DIS基本结构:传感器,数据采集器,计算机。传感器:可以测量力,位移,温度,光,电压,电流等各种物理量,并将物理量转化成相应的电信号。数据采集器:将传感器采集到的各种电信号进行处理后输入计算机。计算机:将数据采集器输入的信号(实验数据),通过应用软件进行分析处理,并以多种形式实时显示在计算机的屏幕上。通信协议:DIS(Distributed Interactive Simulation)分布交互仿真标准协议。应用播报编辑2023年10月,2023全球移动宽带论坛(Global MBB Forum 2023)期间,华为无线网络产品线总裁曹明发布了全球首个全系列5G-A产品解决方案。新产品涉及DIS等六大领域,均为适配5.5G基站网络产品。 [1]新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000

数据接入服务(Data Ingestion Service)_DIS_实时数据_Kafka-华为云

数据接入服务(Data Ingestion Service)_DIS_实时数据_Kafka-华为云

检测到您已登录华为云国际站账号,为了您更好的体验,建议您访问国际站服务网站 https://www.huaweicloud.com/intl/zh-cn 不再显示此消息 中国站 中国站 简体中文 International English Bahasa Indonesia Español Português Türkçe عربي ไทย 简体中文 日本語 Europe English Deutsch Español Français 华为云App 活动 产品 解决方案 定价 云商店 合作伙伴 开发者 支持与服务 了解华为云 清空最近搜索 热门搜索 云耀云服务器L实例 免费试用 云服务器 域名 云速建站 “”的所有结果 文档 备案 控制台 账号中心 费用与成本 待支付订单 待续费产品 未读消息 工单管理 管理控制台 注册 登录 登录 注册 购物车 admin 帐号中心 未实名认证 已实名认证 费用与成本 待支付订单0 待续费产品0 未读消息0 伙伴中心 云商店买家中心 云商店卖家中心 工单管理 开发者个人中心 个性化推荐管理 管理控制台 admin 退出登录 取消 清空最近搜索 热门搜索 云耀云服务器L实例 免费试用 云服务器 域名 云速建站

数据接入服务 DIS

概览

价格详情

帮助文档

论坛

概览

价格详情

帮助文档

论坛

数据接入服务 DIS

数据接入服务

DIS

数据接入服务(Data Ingestion Service,简称DIS)可让您轻松收集、处理和分发实时流数据,以便您对新信息快速做出响应。DIS对接多种第三方数据采集工具,提供丰富的云服务Connector及Agent/SDK。适用于IoT、互联网、媒体等行业的设备监控、实时推荐、日志分析等场景。

按需付费,费用低至¥0.10/小时起

立即购买

价格计算器

管理控制台

产品优势

高效传输

实时收集各种数据。支持百万并发连接,数据请求毫秒级响应。单分区支持最高每日百GB级别的写入量。轻松实现传输通道规格扩容

实时收集各种数据。支持百万并发连接,数据请求毫秒级响应。单分区支持最高每日百GB级别的写入量。轻松实现传输通道规格扩容

简单易用

服务秒级开通。用户配置SDK/Agent实现免编程数据采集,快速实现数据采集、传输

服务秒级开通。用户配置SDK/Agent实现免编程数据采集,快速实现数据采集、传输

安全可靠

HTTPS加密传输。租户间资源及操作隔离,实现租户访问权限控制,保护系统和用户的隐私及数据安全。数据跨AZ存储,服务可用性99.9%

HTTPS加密传输。租户间资源及操作隔离,实现租户访问权限控制,保护系统和用户的隐私及数据安全。数据跨AZ存储,服务可用性99.9%

无忧运维

具有完备的运维体系,托管运维,用户只需要聚焦数据价值。相比用户自建数据采集/传输系统(kafka/flume等),成本降低5倍

具有完备的运维体系,托管运维,用户只需要聚焦数据价值。相比用户自建数据采集/传输系统(kafka/flume等),成本降低5倍

应用场景

实时数据处理

实时文件传输

数据接入备份

实时数据处理

实时收集数据,缓存在通道中,分析平台实时或周期读取通道中的数据分析后将结果应用到业务系统,例如对实时采集城市各交通枢纽的车辆通行数据,基于分析可实现对停车场开放时长和交通资源的调配

优势

永久在线

业务系统随时随地发送数据到DIS

高并发、低延时

支持百万并发消息,端到端时延低至毫秒级

生态完善

支持对接各分析平台,数据传输、计算一站式处理

建议搭配使用

数据湖探索 DLI

MapReduce 服务

实时文件传输

实时检测客户应用系统中产生的日志文件,并采集上传到云上,进行离线分析、存储查询及机器学习,可应用于日志分析、用户画像、营销推荐等场景。

优势

自动捕获增量数据

支持自动采集文件中的增量数据或新增文件

简单易用

提供不同平台Agent,简单配置,即可实现数据采集

安全可靠

传输过程使用https加密,保障数据安全传输

建议搭配使用

对象存储服务 OBS

MapReduce服务

数据湖探索 DLI

数据接入备份

将大量滚动日志文件传输到云端做备份,用于数据丢失或异常后的恢复和故障分析。同时大量小文本文件可合并转储为大文件,提高数据处理性能

优势

多种数据源支持

对接kafka、flume等开源系统,易于集成

数据传输高效

通道入口带宽可调整,传输能力有保障

海量小文件传输

小文件搬迁上云,原文件转储到对象存储

建议搭配使用

对象存储服务 OBS

功能描述

数据采集

RestAPI、SDK、Agent对接多种数据源,线上线下数据实时采集

RestAPI、SDK、Agent对接多种数据源,线上线下数据实时采集

数据传输

实时数据高并发、低延时、高可靠传输

实时数据高并发、低延时、高可靠传输

数据流动

提供多种connector,对接云上数据存储、计算、分析等多种服务,实现用户数据自由流动

提供多种connector,对接云上数据存储、计算、分析等多种服务,实现用户数据自由流动

支持多种数据源

支持多种数据源

DIS支持从用户应用系统、kafka系统、Flume系统做实时数据采集

DIS支持从用户应用系统、kafka系统、Flume系统做实时数据采集

多种数据接入方式

多种数据接入方式

提供RestAPI、SDK、Agent等多种数据接入方式,用户只需简单配置即可实现实时数据采集与传输

提供RestAPI、SDK、Agent等多种数据接入方式,用户只需简单配置即可实现实时数据采集与传输

DIS提供百万连接并发,单数据流最高支持每日TB级别的数据量写入,每个分区(partition)支持最高每日百GB级别的写入量

DIS提供百万连接并发,单数据流最高支持每日TB级别的数据量写入,每个分区(partition)支持最高每日百GB级别的写入量

每个数据流的吞吐能力可以通过动态增加partition进行扩展

每个数据流的吞吐能力可以通过动态增加partition进行扩展

DIS与华为云上的OBS(对象存储服务)、MRS(MapReduce服务)、DWS(数据仓库服务)、CloudTable(表格存储服务)、DLI(数据湖探索)、CS(实时流计算服务)、FunctionGraph(函数工作流)等服务集成,用户通过简单配置即可完成数据转储、计算、分析等功能

DIS与华为云上的OBS(对象存储服务)、MRS(MapReduce服务)、DWS(数据仓库服务)、CloudTable(表格存储服务)、DLI(数据湖探索)、CS(实时流计算服务)、FunctionGraph(函数工作流)等服务集成,用户通过简单配置即可完成数据转储、计算、分析等功能

数据处理

预置数据抽取、汇聚、格式转换等Connector(处理算子),对用户输入数据做预处理

预置数据抽取、汇聚、格式转换等Connector(处理算子),对用户输入数据做预处理

数据缓存

实时数据缓存1-3天,保证实时数据消费可靠性

实时数据缓存1-3天,保证实时数据消费可靠性

DIS预置Connector对接入数据做初步处理,提供CSV/Json到Parquet/CarbonData等格式的转换,提升用户数据质量

DIS预置Connector对接入数据做初步处理,提供CSV/Json到Parquet/CarbonData等格式的转换,提升用户数据质量

帮助文档

开发者工具

数据接入服务API参考

技术文档

数据接入服务用户指南

常见问题

DIS如何发送和接收数据

查看更多

收起

7*24 多渠道服务支持 备案 提供免费备案服务 专业服务 云业务全流程支持 退订 享无忧退订服务 建议反馈 优化改进建议 热门产品 云服务器 云速邮箱 域名注册 云速建站 华为云App 售前咨询热线 950808转1 技术服务咨询 售前咨询 sales@huaweicloud.com 备案服务 beian@huaweicloud.com 云商店咨询 partner@huaweicloud.com 下载华为云App 关注我们 关注华为云 4000 955 988 950808 华为云微信 扫描二维码 华为云微博 扫描二维码 华为云App 扫描下载华为云App 售前咨询:950808转1 法律声明 隐私政策 长按/截图保存,微信识别二维码或者关注公众号“华为云” 关于华为云 了解华为云 客户案例 信任中心 法律协议 新闻报道 华为云直播 热门产品 免费体验中心 云服务器 盘古大模型 SSL证书 华为云WeLink 云速建站 支持与服务 自助服务 服务公告 支持计划 智能客服 联系我们 举报中心 实用工具 文字识别 漏洞扫描 域名注册 华为云会议 定制建站 云服务健康看板 友情链接 华为官网 华为消费者业务 华为开发者联盟 华为企业业务 华为商城 黄大年茶思屋 法律声明 隐私政策 ©2024 Huaweicloud.com 版权所有 黔ICP备20004760号-14 苏B2-20130048号 A2.B1.B2-20070312 域名注册服务机构许可:黔D3-20230001 代理域名注册服务机构:新网、西数 电子营业执照 贵公网安备 52990002000093号

python的dis模块简介 - 知乎

python的dis模块简介 - 知乎切换模式写文章登录/注册python的dis模块简介王晓东​我喜欢生命中只有单纯的渴望0. 参考文档参考文档如下:官方英文文档: https://docs.python.org/3/library/dis.html官方中文文档: https://docs.python.org/zh-cn/3/library/dis.htmlCSDN博客: https://blog.csdn.net/qq_27283619/article/details/106021295博客: https://learnku.com/docs/pymotw/dis-python-bytecode-disassembler/34891. 介绍dis模块1.1. 引言这个模块并不常用,可能你从来没接触过,那么你可能会问:这个模块有什么用,我会在那些地方使用到? 的确,这是python的高阶技巧,不常用,通常只会用在:python的软件调优深入理解python内部执行过程(将你的代码反编译成低级的字节码来查看它底层的工作机制)1.2. 介绍dis模块dis是“Disassembler”的缩写,也就是 反汇编 的意思。汇编【Assemble】: 计算机只能执行01010101……等二进制内容,汇编就是把人可以识别的汇编代码转化为计算机可以识别的二进制代码反汇编【Disassemble】: 把计算机可以识别的二进制内容转化为人可以识别的汇编代码刚多关于汇编的介绍, 请参考: 阮一峰关于汇编的博客: http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html根据上面的描述,那么dis模块自然是提供了很多与反汇编有关的类、方法、函数。1.3. 不可不提的字节码(bytecode)想要介绍python的dis模块,必然先需要了解python的 字节码(bytecode) 。 什么是python的字节码(bytecode)? Python source code is compiled into bytecode, the internal representation of a Python program in the CPython interpreter. The bytecode is also cached in .pyc files so that executing the same file is faster the second time (recompilation from source to bytecode can be avoided). This “intermediate language” is said to run on a virtual machine that executes the machine code corresponding to each bytecode. Do note that bytecodes are not expected to work between different Python virtual machines, nor to be stable between Python releases.中文版说明: Python 源代码会被编译为字节码,即 CPython 解释器中表示 Python 程序的内部代码。字节码还会缓存在 .pyc 文件中,这样第二次执行同一文件时速度更快(可以免去将源码重新编译为字节码)。这种 "中间语言" 运行在根据字节码执行相应机器码的 virtual machine 之上。请注意不同 Python 虚拟机上的字节码不一定通用,也不一定能在不同 Python 版本上兼容。如果需要了解 字节码(bytecode) 的缓存思路,可以参考:PEP3147: https://peps.python.org/pep-3147/2. dis模块入门2.1. dis模块最常用的方法: dis.dis()我们使用dis模块的时候,最常用的方法是dis.dis(), 官方参考文档链接: dis.disdis.dis(x=None, *, file=None, depth=None)每个参数的含义:x参数: 需要被反汇编的对象。 x可以表示模块(module)、类(a class)、方法(a method)、函数(a function)、生成器(a generator)、异步生成器(a asynchronous generator)、协程(a coroutine)、代码对象(a code object)、源代码字符串(a string of source code)或原始字节码的字节序列(a byte sequence of raw bytecode)。对于模块(module),它会反汇编所有功能。对于类(class),它反汇编所有方法(包括类方法(class methods)和静态方法(static methods))。对于代码对象(code object) 或原始字节码序列(sequence of raw bytecode),它每字节码指令打印一行。它还递归地反汇编嵌套代码对象(推导式代码,生成器表达式和嵌套函数,以及用于构建嵌套类的代码)。在被反汇编之前,首先使用 compile() 内置函数将字符串编译为代码对象。如果未提供任何对象,则此函数会反汇编最后一次回溯(the last traceback)。如果提供了入参:file, 会将反汇编的内容作为文本写入 file 参数中; 否则写入 sys.stdout 。递归的最大深度受 depth 限制,除非它是 None 。 depth=0 表示没有递归。其他补充细节:*在 3.4 版更改:* 添加 *file* 形参。*在 3.7 版更改:* 实现了递归反汇编并添加了 *depth* 参数。*在 3.7 版更改:* 现在可以处理协程和异步生成器对象。2.2. 以一个简单的函数为例,说明dis.dis()的使用如何使用dis.dis(), 并阅读dis.dis()输出内容?在stackoverflow中有非常好的回答,请参考: https://stackoverflow.com/questions/12673074/how-should-i-understand-the-output-of-dis-dis 我将其摘录下来并做了翻译,如下:我们先给一个简单的例子:def f(num):

if num == 42:

return True

return False

import dis # 导入dis库

dis.dis(f) # 将f函数的反编译结果打印出来运行程序后反编译的输出结果可能如下(python3.6、python3.8):没有最上面的1、2、3、4、5、6、7 那一列, 之所以加这个,是为了便于解释每一列的作用。(1)|(2)|(3)|(4)| (5) |(6)| (7)

---|---|---|---|----------------------|---|-------

2| | | 0|LOAD_FAST | 0|(num)

|-->| | 2|LOAD_CONST | 1|(42)

| | | 4|COMPARE_OP | 2|(==)

| | | 6|POP_JUMP_IF_FALSE | 12|

| | | | | |

3| | | 8|LOAD_CONST | 2|(True)

| | | 10|RETURN_VALUE | |

| | | | | |

4| |>> | 12|LOAD_CONST | 3|(False)

| | | 14|RETURN_VALUE | |每一列的作用如下:第1列: 源代码中的相应行号. The corresponding line number in the source code第2列: 可选地指示执行的当前指令(例如,当字节码来自框架对象时). Optionally indicates the current instruction executed (when the bytecode comes from a frame object for example)第3列: 一个标签,表示从早期指令到此指令的可能JUMP. A label which denotes a possible JUMP from an earlier instruction to this one第4列: 字节码中与字节索引相对应的地址(这些是2的倍数,因为Python 3.6对每条指令使用2字节,而之前的版本可能会有所不同). The address in the bytecode which corresponds to the byte index (those are multiples of 2 because Python 3.6 use 2 bytes for each instruction, while it could vary in previous versions)第5列: 指令名称(也称为opname),每个指令名称都在dis模块中简要解释,它们的实现可以在ceval.c(CPython的核心文件)中找到. The instruction name (also called opname), each one is briefly explained in the dis module and their implementation can be found in ceval.c (the core loop of CPython)第6列: Python内部用于获取一些常量或变量、管理堆栈、跳转到特定指令等的指令的参数(如果有的话). The argument (if any) of the instruction which is used internally by Python to fetch some constants or variables, manage the stack, jump to a specific instruction, etc.第7列: 对解释器的参数的人性化的解释. The human-friendly interpretation of the instruction argument很明显,这这里最重要的就是第5列的字节码指令(bytecode instructions)。 所有的字节码指令(bytecode instructions) 可以在如下参考文档中找到:官方中文版: https://docs.python.org/zh-cn/3/library/dis.html#bytecodes官方英文版: https://docs.python.org/3/library/dis.html#bytecodes2.3 对比反编译后的内容与原始的字节码在上面代码的基础上,我们增加一行:将原始的字节码打印出来. 修改后的代码:def f(num):

if num == 42:

return True

return False

import dis # 导入dis库

dis.dis(f) # 将f函数的反编译结果打印出来

print('*' * 50) # 打印分割字符

print(f.__code__.co_code) # 将f函数的原始字节码打印出来执行后的结果: 2 0 LOAD_FAST 0 (num)

2 LOAD_CONST 1 (42)

4 COMPARE_OP 2 (==)

6 POP_JUMP_IF_FALSE 12

3 8 LOAD_CONST 2 (True)

10 RETURN_VALUE

4 >> 12 LOAD_CONST 3 (False)

14 RETURN_VALUE

**************************************************

b'|\x00d\x01k\x02r\x0cd\x02S\x00d\x03S\x00'通过这个对比,我们能明显看到为什么要进行反编译了,因为原始的字节码不是给人看的。。。2.4 自己解释原始的字节码如果此时你已经拿到了原始的字节码,想要自己解释这段原始的字节码,你需要使用一些在opcode模块中定义的常量。方法如下:def f(num):

if num == 42:

return True

return False

import dis # 导入dis库

dis.dis(f) # 将f函数的反编译结果打印出来

print('*' * 50) # 打印分割字符

print(f.__code__.co_code) # 将f函数的原始字节码打印出来

print('*' * 50) # 打印分割字符

c = f.__code__.co_code

import opcode

for i in c:

print(f'{i:<6d}:\t{opcode.opname[i]}')执行后的效果: 2 0 LOAD_FAST 0 (num)

2 LOAD_CONST 1 (42)

4 COMPARE_OP 2 (==)

6 POP_JUMP_IF_FALSE 12

3 8 LOAD_CONST 2 (True)

10 RETURN_VALUE

4 >> 12 LOAD_CONST 3 (False)

14 RETURN_VALUE

**************************************************

b'|\x00d\x01k\x02r\x0cd\x02S\x00d\x03S\x00'

**************************************************

124 : LOAD_FAST

0 : <0>

100 : LOAD_CONST

1 : POP_TOP

107 : COMPARE_OP

2 : ROT_TWO

114 : POP_JUMP_IF_FALSE

12 : UNARY_NOT

100 : LOAD_CONST

2 : ROT_TWO

83 : RETURN_VALUE

0 : <0>

100 : LOAD_CONST

3 : ROT_THREE

83 : RETURN_VALUE

0 : <0>3. 分析其他的对象3.1. 反编译一个字典对象代码如下:import dis # 导入dis库

dis.dis("my_dict = {'a': 1}") # 直接反编译一个字典对象执行的结果如下: 1 0 LOAD_CONST 0 ('a')

2 LOAD_CONST 1 (1)

4 BUILD_MAP 1

6 STORE_NAME 0 (my_dict)

8 LOAD_CONST 2 (None)

10 RETURN_VALUE3.2. 反编译一个代码段代码如下:import dis

code = """

my_dict = {'a': 1}

"""

print(f"{'*'* 10}Show Disassembly result{'*'* 10}")

dis.dis(code)

print(f"{'*'* 10}Show Code details{'*'* 10}")

dis.show_code(code)执行效果如下:**********Show Disassembly result**********

2 0 LOAD_CONST 0 ('a')

2 LOAD_CONST 1 (1)

4 BUILD_MAP 1

6 STORE_NAME 0 (my_dict)

8 LOAD_CONST 2 (None)

10 RETURN_VALUE

**********Show Code details**********

Name:

Filename:

Argument count: 0

Positional-only arguments: 0

Kw-only arguments: 0

Number of locals: 0

Stack size: 2

Flags: NOFREE

Constants:

0: 'a'

1: 1

2: None

Names:

0: my_dict3.3. 反编译一个支持任意位置参数的函数代码如下:def f(*args):

nargs = len(args)

print(nargs, args)

if __name__ == '__main__':

import dis

dis.dis(f)执行的结果: 2 0 LOAD_GLOBAL 0 (len)

2 LOAD_FAST 0 (args)

4 CALL_FUNCTION 1

6 STORE_FAST 1 (nargs)

3 8 LOAD_GLOBAL 1 (print)

10 LOAD_FAST 1 (nargs)

12 LOAD_FAST 0 (args)

14 CALL_FUNCTION 2

16 POP_TOP

18 LOAD_CONST 0 (None)

20 RETURN_VALUE3.4. 反编译一个简单的类示例代码:class A:

def __init__(self, name):

self.name = name

def twice_name(self):

return self.name * 2

import dis

import pprint

dis.dis(A)

print('*' * 75)

pprint.pprint(A.__dict__)执行的结果:Disassembly of __init__:

3 0 LOAD_FAST 1 (name)

2 LOAD_FAST 0 (self)

4 STORE_ATTR 0 (name)

6 LOAD_CONST 0 (None)

8 RETURN_VALUE

Disassembly of twice_name:

6 0 LOAD_FAST 0 (self)

2 LOAD_ATTR 0 (name)

4 LOAD_CONST 1 (2)

6 BINARY_MULTIPLY

8 RETURN_VALUE

***************************************************************************

mappingproxy({'__dict__': ,

'__doc__': None,

'__init__': ,

'__module__': '__main__',

'__weakref__': ,

'twice_name': })可以看到: 虽然我们想象中类比较复杂,但是其实类的字节码并不很复杂。 这里明显的分成了两部分, 每一个函数对应其中的一部分。发布于 2022-10-10 22:24PythonPython 入门反汇编​赞同 15​​添加评论​分享​喜欢​收藏​申请

dis- | "dis-" 的词源、"dis-" 的起源和意思 - etymonline

| "dis-" 的词源、"dis-" 的起源和意思 - etymonline搜索Quick search commandColumnsForumAppsPremium登录登录广告dis-拉丁语词缀,意为1. “缺乏,不”(如 dishonest); 2. “相反,做相反的事”(如 disallow); 3. “分开,离开”(如 discard),源自古法语 des- 或直接源自拉丁语 dis-,意为“分开,分离,朝不同方向,比喻为‘不,非’,也表示‘极其,完全’。在大多数有声辅音前,它被同化为 dif-,在 -f- 前被同化为 di-。拉丁语前缀来自原始印欧语言的 *dis-,意为“分开,分离”(源自古英语 te-,古撒克逊语 ti-,古高地德语 ze-,德语 zer-)。原始印欧语言的根词是 *dwis- 的次生形式,因此与拉丁语 bis “两次”(最初为 *dvis)和 duo 有关,表示“两种方式,分开”(因此表示“分开,分离”)。在古典拉丁语中, dis- 与 de- 相似,意思也差不多,但在后期拉丁语中, dis- 成为首选形式,并传入古法语中,成为古法语中形成复合词的形式,越来越具有否定意义(“不”)。在英语中,许多这些词最终被改回了 dis-,而在法语中,许多词被改回了 de-。通常存在混淆。作为英语中的一个活前缀,它反转或否定了它所附着的词。有时,如意大利语中,它被缩减为 s-(如 spend, splay, sport, sdain 表示 disdain,以及姓氏 Spencer 和 Spence)。 dis-相关词汇 dis-disallow(v.)14世纪晚期,“拒绝赞扬”(现已过时),源自古法语 desalouer “责备”,由 des- “不,相反”(见 dis-)和 alouer(见 allow)组成。意思是“拒绝接受或承认”,也包括“拒绝允许,拒绝批准或认可”,始见于1400年左右。相关词汇: Disallowed, disallowing, disallowance。discard(v.)1590年代,“按照游戏规则将发给玩家的牌扔掉或拒绝”,字面意思是“扔掉一张牌”,源自 dis- “离开”和 card(n.1)。比喻意义(非游戏意义)“放弃,解雇”稍早有记载(1580年代)。在打牌的意义上, decard 在1550年代已有记载。相关词汇: Discarded; discarding。作为名词,“丢弃或拒绝的行为”,始于1742年。disdaindishonestSpencerspendsplaysportaddressadroitdebacledebardebarkdecampdecrydefacedefeasancedefeatdeferdefianceSee all related words (303)广告仅供参考,由机器翻译系统提供。查看原文,请访问:Etymology, origin and meaning of dis-广告在 dis- 附近的词典条目dirigibledirkdirndldirtdirtydis-disDisdisabilitydisabledisabled链接论坛参考文献链接产品iOS 应用安卓应用Chrome 扩展关于网站作者网站简介在 Facebook 关注我们支持通过 PayPal 捐赠Patreon 订阅支持购买周边简体中文 (Chinese)深色自动浅色服务协议隐私政策Copyright © 2001 - 2023 Douglas Har

dis --- Python 字节码反汇编器 — Python 3.12.2 文档

dis --- Python 字节码反汇编器 — Python 3.12.2 文档

Theme

Auto

Light

Dark

目录

dis --- Python 字节码反汇编器

命令行接口

字节码分析

分析函数

Python字节码说明

操作码集合

上一主题

compileall --- 字节编译 Python 库

下一主题

pickletools --- pickle 开发者工具集

当前页面

报告 Bug

显示源码

导航

索引

模块 |

下一页 |

上一页 |

Python »

3.12.2 Documentation »

Python 标准库 »

Python 语言服务 »

dis --- Python 字节码反汇编器

|

Theme

Auto

Light

Dark

|

dis --- Python 字节码反汇编器¶

Source code: Lib/dis.py

dis 模块通过反汇编支持CPython的 bytecode 分析。该模块作为输入的 CPython 字节码在文件 Include/opcode.h 中定义,并由编译器和解释器使用。

CPython 实现细节: 字节码是 CPython 解释器的实现细节。不保证不会在Python版本之间添加、删除或更改字节码。不应考虑将此模块的跨 Python VM 或 Python 版本的使用。

在 3.6 版本发生变更: 每条指令使用2个字节。以前字节数因指令而异。

在 3.10 版本发生变更: 跳转、异常处理和循环指令的参数现在将为指令偏移量而不是字节偏移量。

在 3.11 版本发生变更: 有些指令带有一个或多个内联缓存条目,它们是采用 CACHE 指令的形式。 这些指令默认是隐藏的,但可以通过将 show_caches=True 传给任何 dis 工具对象来显示。 此外,解释器现在会适配字节码以使其能针对不同的运行时条件实现专门化。 适配的字节码可通过传入 adaptive=True 来显示。

在 3.12 版本发生变更: 跳转的参数是目标指令相对于紧接在跳转指令的 CACHE 条目之后的指令的偏移量。

因此,CACHE 指令的存在对前向跳转是透明的但在处理后向跳转时则需要将其纳入考虑。

示例:给定函数 myfunc():

def myfunc(alist):

return len(alist)

可以使用以下命令显示 myfunc() 的反汇编:

>>> dis.dis(myfunc)

2 0 RESUME 0

3 2 LOAD_GLOBAL 1 (NULL + len)

12 LOAD_FAST 0 (alist)

14 CALL 1

22 RETURN_VALUE

("2" 是行号)。

命令行接口¶

dis 模块可以在命令行下作为一个脚本来发起调用:

python -m dis [-h] [infile]

可以接受以下选项:

-h, --help¶

显示用法并退出。

如果指定了 infile,其反汇编代码将被写入到标准输出。 否则,反汇编将在从标准输入接收的已编译源代码上进行。

字节码分析¶

在 3.4 版本加入.

字节码分析 API 允许将 Python 代码片段包装在 Bytecode 对象中,以便轻松访问已编译代码的详细信息。

class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False)¶

分析的字节码对应于函数、生成器、异步生成器、协程、方法、源代码字符串或代码对象(由 compile() 返回)。

这是下面列出的许多函数的便利包装,最值得注意的是 get_instructions() ,迭代于 Bytecode 的实例产生字节码操作 Instruction 的实例。

如果 first_line 不是 None ,则表示应该为反汇编代码中的第一个源代码行报告的行号。否则,源行信息(如果有的话)直接来自反汇编的代码对象。

如果 current_offset 不是 None ,则它指的是反汇编代码中的指令偏移量。设置它意味着 dis() 将针对指定的操作码显示“当前指令”标记。

如果 show_caches 为 True,dis() 将显示解释器用来专门化字节码的内联缓存条目。

如果 adaptive 为 True,dis() 将显示可能不同于原始字节码的专门化字节码。

classmethod from_traceback(tb, *, show_caches=False)¶

从给定回溯构造一个 Bytecode 实例,将设置 current_offset 为异常负责的指令。

codeobj¶

已编译的代码对象。

first_line¶

代码对象的第一个源代码行(如果可用)

dis()¶

返回字节码操作的格式化视图(与 dis.dis() 打印相同,但作为多行字符串返回)。

info()¶

返回带有关于代码对象的详细信息的格式化多行字符串,如 code_info() 。

在 3.7 版本发生变更: 现在可以处理协程和异步生成器对象。

在 3.11 版本发生变更: 增加了 show_caches 和 adaptive 形参。

示例:

>>> bytecode = dis.Bytecode(myfunc)

>>> for instr in bytecode:

... print(instr.opname)

...

RESUME

LOAD_GLOBAL

LOAD_FAST

CALL

RETURN_VALUE

分析函数¶

dis 模块还定义了以下分析函数,它们将输入直接转换为所需的输出。如果只执行单个操作,它们可能很有用,因此中间分析对象没用:

dis.code_info(x)¶

返回格式化的多行字符串,其包含详细代码对象信息的用于被提供的函数、生成器、异步生成器、协程、方法、源代码字符串或代码对象。

请注意,代码信息字符串的确切内容是高度依赖于实现的,它们可能会在Python VM或Python版本中任意更改。

在 3.2 版本加入.

在 3.7 版本发生变更: 现在可以处理协程和异步生成器对象。

dis.show_code(x, *, file=None)¶

将提供的函数、方法。源代码字符串或代码对象的详细代码对象信息打印到 file (如果未指定 file ,则为 sys.stdout )。

这是 print(code_info(x), file=file) 的便捷简写,用于在解释器提示符下进行交互式探索。

在 3.2 版本加入.

在 3.4 版本发生变更: 添加 file 形参。

dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False)¶

反汇编 x 对象。 x 可以表示模块、类、方法、函数、生成器、异步生成器、协程、代码对象、源代码字符串或原始字节码的字节序列。 对于模块,它会反汇编所有函数。 对于一个类,它会反汇编所有方法(包括类方法和静态方法)。 对于代码对象或原始字节码序列,它会为每条字节码指令打印一行。 它还会递归地反汇编嵌套代码对象。 这些对象包括生成器表达式、嵌套函数、嵌套类的语句体以及用于 标注作用域 的代码对象。 在反汇编之前,首先使用 compile() 内置函数将字符串编译为代码对象。 如果未提供任何对象,则该函数将反汇编最后一次回溯。

如果提供的话,反汇编将作为文本写入提供的 file 参数,否则写入 sys.stdout 。

递归的最大深度受 depth 限制,除非它是 None 。 depth=0 表示没有递归。

如果 show_caches 为 True,此函数将显示解释器用来专门化字节码的内联缓存条目。

如果 adaptive 为 True,此函数将显示可能不同于原始字节码的专门化字节码。

在 3.4 版本发生变更: 添加 file 形参。

在 3.7 版本发生变更: 实现了递归反汇编并添加了 depth 参数。

在 3.7 版本发生变更: 现在可以处理协程和异步生成器对象。

在 3.11 版本发生变更: 增加了 show_caches 和 adaptive 形参。

dis.distb(tb=None, *, file=None, show_caches=False, adaptive=False)¶

如果没有传递,则使用最后一个回溯来反汇编回溯的堆栈顶部函数。 指示了导致异常的指令。

如果提供的话,反汇编将作为文本写入提供的 file 参数,否则写入 sys.stdout 。

在 3.4 版本发生变更: 添加 file 形参。

在 3.11 版本发生变更: 增加了 show_caches 和 adaptive 形参。

dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False)¶

dis.disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False)¶

反汇编代码对象,如果提供了 lasti ,则指示最后一条指令。输出分为以下几列:

行号,用于每行的第一条指令

当前指令,表示为 --> ,

一个标记的指令,用 >> 表示,

指令的地址,

操作码名称,

操作参数,和

括号中参数的解释。

参数解释识别本地和全局变量名称、常量值、分支目标和比较运算符。

如果提供的话,反汇编将作为文本写入提供的 file 参数,否则写入 sys.stdout 。

在 3.4 版本发生变更: 添加 file 形参。

在 3.11 版本发生变更: 增加了 show_caches 和 adaptive 形参。

dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False)¶

在所提供的函数、方法、源代码字符串或代码对象中的指令上返回一个迭代器。

迭代器生成一系列 Instruction ,命名为元组,提供所提供代码中每个操作的详细信息。

如果 first_line 不是 None ,则表示应该为反汇编代码中的第一个源代码行报告的行号。否则,源行信息(如果有的话)直接来自反汇编的代码对象。

show_caches 和 adaptive 形参的作用与 dis() 中的同名形参相同。

在 3.4 版本加入.

在 3.11 版本发生变更: 增加了 show_caches 和 adaptive 形参。

dis.findlinestarts(code)¶

这个生成器函数使用 代码对象 code 的 co_lines() 方法来查找源代码中行开头的偏移量。 它们将作为 (offset, lineno) 对被生成。

在 3.6 版本发生变更: 行号可能会减少。 以前,他们总是在增加。

在 3.10 版本发生变更: 使用 PEP 626 co_lines() 方法而不是 代码对象 的 co_firstlineno 和 co_lnotab 属性。

dis.findlabels(code)¶

检测作为跳转目标的原始编译后字节码字符串 code 中的所有偏移量,并返回这些偏移量的列表。

dis.stack_effect(opcode, oparg=None, *, jump=None)¶

使用参数 oparg 计算 opcode 的堆栈效果。

如果代码有一个跳转目标并且 jump 是 True ,则 drag_effect() 将返回跳转的堆栈效果。如果 jump 是 False ,它将返回不跳跃的堆栈效果。如果 jump 是 None (默认值),它将返回两种情况的最大堆栈效果。

在 3.4 版本加入.

在 3.8 版本发生变更: 添加 jump 参数。

Python字节码说明¶

get_instructions() 函数和 Bytecode 类提供字节码指令的详细信息的 Instruction 实例:

class dis.Instruction¶

字节码操作的详细信息

opcode¶

操作的数字代码,对应于下面列出的操作码值和 操作码集合 中的字节码值。

opname¶

人类可读的操作名称

arg¶

操作的数字参数(如果有的话),否则为 None

argval¶

已解析的 arg 值(如果有的话),否则为 None

argrepr¶

人类可读的操作参数(如果存在)的描述,否则为空字符串。

offset¶

在字节码序列中启动操作索引

starts_line¶

行由此操作码(如果有)启动,否则为 None

is_jump_target¶

如果其他代码跳到这里,则为 True ,否则为 False

positions¶

dis.Positions 对象保存了这条指令所涵盖的起始和结束位置。

在 3.4 版本加入.

在 3.11 版本发生变更: 增加了 positions 字段。

class dis.Positions¶

考虑到此信息不可用的情况,某些字段可能为 None。

lineno¶

end_lineno¶

col_offset¶

end_col_offset¶

在 3.11 版本加入.

Python编译器当前生成以下字节码指令。

一般指令

在下文中,我们将把解释器栈称为 STACK 并像描述 Python 列表一样描述对它的操作。 栈顶对应于该语言中的 STACK[-1]。

NOP¶

无操作代码。 被字节码优化器用作占位符,以及生成行追踪事件。

POP_TOP¶

移除除堆栈顶部的项:

STACK.pop()

END_FOR¶

连续移除堆栈顶部的两个值。 等价于 POP_TOP; POP_TOP 。 用于循环结束时的清理,因此而得名。

在 3.12 版本加入.

END_SEND¶

实现 del STACK[-2]。 用于在生成器退出时进行清理。

在 3.12 版本加入.

COPY(i)¶

将第 i 项推入栈顶,并不移除原项:

assert i > 0

STACK.append(STACK[-i])

在 3.11 版本加入.

SWAP(i)¶

将栈顶的项与栈中第 i 项互换:

STACK[-i], STACK[-1] = STACK[-1], STACK[-i]

在 3.11 版本加入.

CACHE¶

此操作码不是真正的指令,它被用来为解释器标记额外空间以便在字节码中直接缓存有用的数据。 它会被所有 dis 工具自动隐藏,但可以通过 show_caches=True 来查看。

从逻辑上说,此空间是之前的指令的组成部分。 许多操作码都预期带有固定数量的缓存,并会指示解释器在运行时跳过它们。

被填充的缓存看起来可以像是任意的指令,因此在读取或修改包含快取数据的原始自适应字节码时应当非常小心。

在 3.11 版本加入.

一元操作

一元操作获取堆栈顶部元素,应用操作,并将结果推回堆栈。

UNARY_NEGATIVE¶

实现 STACK[-1] = -STACK[-1] 。

UNARY_NOT¶

实现 STACK[-1] = not STACK[-1] 。

UNARY_INVERT¶

实现 STACK[-1] = ~STACK[-1] 。

GET_ITER¶

实现 STACK[-1] = iter(STACK[-1]) 。

GET_YIELD_FROM_ITER¶

如果 STACK[-1] 是一个 generator iterator 或 coroutine 对象则它将保持原样。 否则,将实现 STACK[-1] = iter(STACK[-1])。

在 3.5 版本加入.

双目和原地操作

双目操作移除栈顶的两项( STACK[-1] 和 STACK[-2] ),执行其运算操作,并将结果放回栈中。

原地操作类似于双目操作,但当 STACK[-2] 支持时,操作将在原地进行。 结果 STACK[-1] 可能(但不一定)是原先 STACK[-2] 的值。

BINARY_OP(op)¶

实现双目和原地操作运算符(取决于 op 的值):

rhs = STACK.pop()

lhs = STACK.pop()

STACK.append(lhs op rhs)

在 3.11 版本加入.

BINARY_SUBSCR¶

实现:

key = STACK.pop()

container = STACK.pop()

STACK.append(container[key])

STORE_SUBSCR¶

实现:

key = STACK.pop()

container = STACK.pop()

value = STACK.pop()

container[key] = value

DELETE_SUBSCR¶

实现:

key = STACK.pop()

container = STACK.pop()

del container[key]

BINARY_SLICE¶

实现:

end = STACK.pop()

start = STACK.pop()

container = STACK.pop()

STACK.append(container[start:end])

在 3.12 版本加入.

STORE_SLICE¶

实现:

end = STACK.pop()

start = STACK.pop()

container = STACK.pop()

values = STACK.pop()

container[start:end] = value

在 3.12 版本加入.

协程操作码

GET_AWAITABLE(where)¶

实现 STACK[-1] = get_awaitable(STACK[-1]) 。其中对于 get_awaitable(o) ,当 o 是一个有 CO_ITERABLE_COROUTINE 旗标的协程对象或生成器对象时,返回 o,否则解析 o.__await__ 。

如果 where 操作数为非零值,则表示指令所在的位置:

1:在调用 __aenter__ 之后

2:在调用 __aexit__ 之后

在 3.5 版本加入.

在 3.11 版本发生变更: 在之前版本中,该指令没有 oparg。

GET_AITER¶

实现 STACK[-1] = STACK[-1].__aiter__()。

在 3.5 版本加入.

在 3.7 版本发生变更: 已经不再支持从 __aiter__ 返回可等待对象。

GET_ANEXT¶

对堆栈实现 STACK.append(get_awaitable(STACK[-1].__anext__())) 。 关于 get_awaitable 的细节,见 GET_AWAITABLE 。

在 3.5 版本加入.

END_ASYNC_FOR¶

终结一个 async for 循环。 在等待下一项时处理被引发的异常。 栈包含了 STACK[-2] 中的异步可迭代对象和 STACK[-1] 中的已引发异常。 两者都将被弹出。 如果异常不是 StopAsyncIteration,它会被重新引发。

在 3.8 版本加入.

在 3.11 版本发生变更: 栈中的异常表示形式现在将由一个而不是三个条目组成。

CLEANUP_THROW¶

处理当前帧中由调用 throw() 或 close() 引发的异常。 如果 STACK[-1] 是 StopIteration 的实例,则从栈中弹出三个值,并将其成员 value 的值推入栈中,否则重新引发 STACK[-1] 异常。

在 3.12 版本加入.

BEFORE_ASYNC_WITH¶

从 STACK[-1] 解析 __aenter__ 和 __aexit__ 。 将 __aexit__ 和 __aenter__() 的结果推入栈中:

STACK.extend((__aexit__, __aenter__())

在 3.5 版本加入.

其他操作码

SET_ADD(i)¶

实现:

item = STACK.pop()

set.add(STACK[-i], item)

用于实现集合推导式。

LIST_APPEND(i)¶

实现:

item = STACK.pop()

list.append(STACK[-i], item)

用于实现列表推导式。

MAP_ADD(i)¶

实现:

value = STACK.pop()

key = STACK.pop()

dict.__setitem__(STACK[-i], key, value)

用于实现字典推导式。

在 3.1 版本加入.

在 3.8 版本发生变更: 映射的值为 STACK[-1] ,映射的键为 STACK[-2] 。之前它们是反过来的。

对于所有 SET_ADD 、 LIST_APPEND 和 MAP_ADD 指令,当弹出添加的值或键值对时,容器对象保留在堆栈上,以便它可用于循环的进一步迭代。

RETURN_VALUE¶

返回 STACK[-1] 给函数的调用者。

RETURN_CONST(consti)¶

返回 co_consts[consti] 给函数的调用者。

在 3.12 版本加入.

YIELD_VALUE¶

从 generator 产生 STACK.pop()。

在 3.11 版本发生变更: oparg 被设为堆栈深度。

在 3.12 版本发生变更: oparg 被设为异常块的深度,以确保关闭生成器的效率。

SETUP_ANNOTATIONS¶

检查 __annotations__ 是否在 locals() 中定义,如果没有,它被设置为空 dict 。只有在类或模块体静态地包含 variable annotations 时才会发出此操作码。

在 3.6 版本加入.

POP_EXCEPT¶

从栈中弹出一个值,它将被用来恢复异常状态。

在 3.11 版本发生变更: 栈中的异常表示形式现在将由一个而不是三个条目组成。

RERAISE¶

重新引发当前位于栈顶的异常。 如果 oparg 为非零值,则从栈顶额外弹出一个值用来设置当前帧的 f_lasti。

在 3.9 版本加入.

在 3.11 版本发生变更: 栈中的异常表示形式现在将由一个而不是三个条目组成。

PUSH_EXC_INFO¶

从栈中弹出一个值。 将当前异常推入栈顶。 将原先被弹出的值推回栈。 在异常处理句柄中使用。

在 3.11 版本加入.

CHECK_EXC_MATCH¶

为 except 执行异常匹配。 检测 STACK[-2] 是否为匹配 STACK[-1] 的异常。 弹出 STACK[-1] 并将测试的布尔值结果推入栈。

在 3.11 版本加入.

CHECK_EG_MATCH¶

为 except* 执行异常匹配。 在代表 STACK[-2] 的异常组上应用 split(STACK[-1])。

在匹配的情况下,从栈中弹出两项并推入不匹配的子分组 (如完全匹配则为 None) 以及匹配的子分组。 当没有任何匹配时,则弹出一项 (匹配类型) 并推入 None。

在 3.11 版本加入.

WITH_EXCEPT_START¶

调用栈中 4 号位置上的函数并附带代表位于栈顶的异常的参数 (type, val, tb)。 用于在 with 语句内发生异常时实现调用 context_manager.__exit__(*exc_info())。

在 3.9 版本加入.

在 3.11 版本发生变更: __exit__ 函数位于栈的 4 号位而不是 7 号位。 栈中的异常表示形式现在由一项而不是三项组成。

LOAD_ASSERTION_ERROR¶

将 AssertionError 推入栈顶。 由 assert 语句使用。

在 3.9 版本加入.

LOAD_BUILD_CLASS¶

将 builtins.__build_class__() 推入栈中。 之后它将会被调用来构造一个类。

BEFORE_WITH¶

此操作码会在 with 代码块开始之前执行多个操作。 首先,它将从上下文管理器加载 __exit__() 并将其推入栈顶以供 WITH_EXCEPT_START 后续使用。 然后,将调用 __enter__()。 最后,将调用 __enter__() 方法的结果推入栈顶。

在 3.11 版本加入.

GET_LEN¶

执行 STACK.append(len(STACK[-1])) 。

在 3.10 版本加入.

MATCH_MAPPING¶

如果 STACK[-1] 是 collections.abc.Mapping 的实例(或者更准确地说:如果在它的 tp_flags 中设置了 Py_TPFLAGS_MAPPING 旗标),则将 True 推入栈顶。 否则,推入 False。

在 3.10 版本加入.

MATCH_SEQUENCE¶

如果 STACK[-1] 是 collections.abc.Sequence 的实例而 不是 str/bytes/bytearray 的实例(或者更准确地说:如果在它的 tp_flags 中设置了 Py_TPFLAGS_SEQUENCE 旗标),则将 True 推入栈顶。 否则 ,推入 False。

在 3.10 版本加入.

MATCH_KEYS¶

STACK[-1] 是一个映射键的元组,而 STACK[-2] 是匹配目标。 如果 STACK[-2] 包含 STACK[-1] 中的所有键,则推入一个包含对应值的 tuple。 在其他情况下,推入 None。

在 3.10 版本加入.

在 3.11 版本发生变更: 在之前的版本中,该指令还会推入一个表示成功 (True) 或失败 (False) 的布尔值。

STORE_NAME(namei)¶

实现 name = STACK.pop()。 namei 是 name 在 代码对象 的 co_names 属性中的索引。 在可能的情况下编译器会尝试使用 STORE_FAST 或 STORE_GLOBAL。

DELETE_NAME(namei)¶

实现 del name,其中 namei 是 代码对象 的 co_names 属性的索引。

UNPACK_SEQUENCE(count)¶

将 STACK[-1] 解包为 count 个单独的值,然后自右向左放入栈中。要求有确切的 count 值:

assert(len(STACK[-1]) == count)

STACK.extend(STACK.pop()[:-count-1:-1])

UNPACK_EX(counts)¶

实现带星号目标的赋值:将 STACK[-1] 中的可迭代对象解包为各个单独的值。 值的总数可以小于可迭代对象的项数:其中会有一个值是存放剩下的项的列表。

在列表前后的值的数量被限制在255。

列表前的值的数量被编码在操作码的参数之中。 如果列表后有值,则其数量会被用 EXTENDED_ARG 编码。 因此参数可以被认为是一个双字节值,其中低位字节代表列表前的值的数量,高位字节代表其后的值的数量。

提取出来的值被自右向左放入栈中,也就是说 a, *b, c = d 在执行完成之后会被这样储存: STACK.extend((a, b, c)) 。

STORE_ATTR(namei)¶

实现:

obj = STACK.pop()

value = STACK.pop()

obj.name = value

其中 namei 是 name 在 代码对象 的 co_names 中的索引。

DELETE_ATTR(namei)¶

实现:

obj = STACK.pop()

del obj.name

其中 namei 是 name 在 代码对象 的 co_names 中的索引。

STORE_GLOBAL(namei)¶

类似于 STORE_NAME 但会将 name 存储为全局变量。

DELETE_GLOBAL(namei)¶

类似于 DELETE_NAME 但会删除一个全局变量。

LOAD_CONST(consti)¶

将 co_consts[consti] 推入栈顶。

LOAD_NAME(namei)¶

将 co_names[namei] 关联的值压入栈中。 名称的查找范围包括局部变量,然后是全局变量,然后是内置量。

LOAD_LOCALS¶

将一个局部变量字典的引用压入栈中。 被用于为 LOAD_FROM_DICT_OR_DEREF 和 LOAD_FROM_DICT_OR_GLOBALS 准备命名空间字典。

在 3.12 版本加入.

LOAD_FROM_DICT_OR_GLOBALS(i)¶

从栈中弹出一个映射,在其中查找 co_names[namei]。 如果在此没有找到相应的名称,则在全局变量和内置量中查找,类似 LOAD_GLOBAL 。 被用于在类定义中的 标注作用域 中加载全局变量。

在 3.12 版本加入.

BUILD_TUPLE(count)¶

创建一个使用了来自栈的 count 个项的元组,并将结果元组推入栈顶:

assert count > 0

STACK, values = STACK[:-count], STACK[-count:]

STACK.append(tuple(values))

BUILD_LIST(count)¶

类似于 BUILD_TUPLE 但会创建一个列表。

BUILD_SET(count)¶

类似于 BUILD_TUPLE 但会创建一个集合。

BUILD_MAP(count)¶

将一个新字典对象推入栈顶。 弹出 2 * count 项使得字典包含 count 个条目: {..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]} 。

在 3.5 版本发生变更: 字典是根据栈中的项创建而不是创建一个预设大小包含 count 项的空字典。

BUILD_CONST_KEY_MAP(count)¶

BUILD_MAP 版本专用于常量键。 弹出的栈顶元素包含一个由键构成的元组,然后从 STACK[-2] 开始从构建字典的值中弹出 count 个值。

在 3.6 版本加入.

BUILD_STRING(count)¶

拼接 count 个来自栈的字符串并将结果字符串推入栈顶。

在 3.6 版本加入.

LIST_EXTEND(i)¶

实现:

seq = STACK.pop()

list.extend(STACK[-i], seq)

用于构建列表。

在 3.9 版本加入.

SET_UPDATE(i)¶

实现:

seq = STACK.pop()

set.update(STACK[-i], seq)

用于构建集合。

在 3.9 版本加入.

DICT_UPDATE(i)¶

实现:

map = STACK.pop()

dict.update(STACK[-i], map)

用于构建字典。

在 3.9 版本加入.

DICT_MERGE(i)¶

类似于 DICT_UPDATE 但对于重复的键会引发异常。

在 3.9 版本加入.

LOAD_ATTR(namei)¶

如果 namei 的低位未设置,则将 STACK[-1] 替换为 getattr(STACK[-1], co_names[namei>>1])。

如果 namei 的低位已设置,则会尝试从 STACK[-1] 对象加载名为 co_names[namei>>1] 的方法。 STACK[-1] 会被弹出。 此字节码会区分两种情况:如果 STACK[-1] 具有一个名称正确的方法,字节码会推入未绑定的方法和 STACK[-1]。 STACK[-1] 将被 CALL 用作调用未绑定方法时的第一个参数 (self)。 否则,将推入 NULL 和属性查询所返回的对象。

在 3.12 版本发生变更: 如果 namei 的低位已置,则会在属性或未绑定方法之前分别将 NULL 或 self 推入栈。

LOAD_SUPER_ATTR(namei)¶

该操作码实现了 super(),包括零参数和双参数形式 (例如 super().method(), super().attr 和 super(cls, self).method(), super(cls, self).attr)。

它会从栈中弹出三个值(从栈顶向下): - self: 当前方法的第一个参数 - cls: 当前方法定义所在的类 - 全局 super

对应于其参数,它的操作类似于 LOAD_ATTR,区别在于 namei 左移了 2 位而不是 1 位。

namei 的低位发出尝试加载方法的信号,与 LOAD_ATTR 一样,其结果是推入 None 和所加载的方法。 当其被取消设置时则将单个值推入栈。

namei 的次低比特位如果被设置,表示这是对 super() 附带两个参数的调用(未设置则表示附带零个参数)。

在 3.12 版本加入.

COMPARE_OP(opname)¶

执行布尔运算操作。 操作名称可在 cmp_op[opname] 中找到。

IS_OP(invert)¶

执行 is 比较,或者如果 invert 为 1 则执行 is not。

在 3.9 版本加入.

CONTAINS_OP(invert)¶

执行 in 比较,或者如果 invert 为 1 则执行 not in。

在 3.9 版本加入.

IMPORT_NAME(namei)¶

导入模块 co_names[namei]。 会弹出 STACK[-1] 和 STACK[-2] 以提供 fromlist 和 level 参数给 __import__() 。 模块对象会被推入栈顶。 当前命名空间不受影响:对于一条标准 import 语句,会执行后续的 STORE_FAST 指令来修改命名空间。

IMPORT_FROM(namei)¶

从在 STACK[-1] 内找到的模块中加载属性 co_names[namei]。 结果对象会被推入栈顶,以便由后续的 STORE_FAST 指令来保存。

JUMP_FORWARD(delta)¶

将字节码计数器的值增加 delta。

JUMP_BACKWARD(delta)¶

将字节码计数器减少 delta。 检查中断。

在 3.11 版本加入.

JUMP_BACKWARD_NO_INTERRUPT(delta)¶

将字节码计数器减少 delta。 不检查中断。

在 3.11 版本加入.

POP_JUMP_IF_TRUE(delta)¶

如果 STACK[-1] 为真值,则将字节码计数器增加 delta。 STACK[-1] 将被弹出。

在 3.11 版本发生变更: 操作符的参数现在是一个相对的差值而不是一个绝对的目标量。 此操作码是一个伪指令,在最终的字节码里被定向的版本( forward/backward )取代。

在 3.12 版本发生变更: 该操作码现在不再是伪指令。

POP_JUMP_IF_FALSE(delta)¶

如果 STACK[-1] 为假值,则将字节码计数器增加 delta。 STACK[-1] 将被弹出。

在 3.11 版本发生变更: 操作符的参数现在是一个相对的差值而不是一个绝对的目标量。 此操作码是一个伪指令,在最终的字节码里被定向的版本( forward/backward )取代。

在 3.12 版本发生变更: 该操作码现在不再是伪指令。

POP_JUMP_IF_NOT_NONE(delta)¶

如果 STACK[-1] 不为 None ,则将字节码计数器增加 delta。 STACK[-1] 将被弹出。

此操作码是一个伪指令,在最终的字节码里被定向的版本( forward/backward )取代。

在 3.11 版本加入.

在 3.12 版本发生变更: 该操作码现在不再是伪指令。

POP_JUMP_IF_NONE(delta)¶

如果 STACK[-1] 为 None ,则将字节码计数器增加 delta。 STACK[-1] 将被弹出。

此操作码是一个伪指令,在最终的字节码里被定向的版本( forward/backward )取代。

在 3.11 版本加入.

在 3.12 版本发生变更: 该操作码现在不再是伪指令。

FOR_ITER(delta)¶

STACK[-1] 是一个 iterator。 调用其 __next__() 方法。 如果产生一个新的值则压入栈中 (把迭代器压下去)。 如果迭代器已耗尽,则将字节码计数器增加 delta 。

在 3.12 版本发生变更: 直到 3.11 ,当迭代器耗尽时,它会被从栈中弹出。

LOAD_GLOBAL(namei)¶

将名为 co_names[namei>>1] 的全局对象加载到栈顶。

在 3.11 版本发生变更: 如果设置了 namei 的低比特位,则会在全局变量前将一个 NULL 推入栈。

LOAD_FAST(var_num)¶

将指向局部对象 co_varnames[var_num] 的引用推入栈顶。

在 3.12 版本发生变更: 这个操作码目前只用在保证局部变量被初始化的情况下使用。它不能引发 UnboundLocalError 。

LOAD_FAST_CHECK(var_num)¶

将一个指向局部变量 co_varnames[var_num] 的引用推入栈中,如果该局部变量未被初始化,引发一个 UnboundLocalError 。

在 3.12 版本加入.

LOAD_FAST_AND_CLEAR(var_num)¶

将一个指向局部变量 co_varnames[var_num] 的引用推入栈中(如果该局部变量未被初始化,则推入一个 NULL )然后将 co_varnames[var_num] 设为 NULL 。

在 3.12 版本加入.

STORE_FAST(var_num)¶

将 STACK.pop() 存放到局部变量 co_varnames[var_num] 。

DELETE_FAST(var_num)¶

移除局部对象 co_varnames[var_num]。

MAKE_CELL(i)¶

在槽位 i 中创建一个新单元。 如果该槽位为非空则该值将存储到新单元中。

在 3.11 版本加入.

LOAD_CLOSURE(i)¶

推入一个指向包含在 "fast locals" 存储的 i 号槽位的单元的引用。 变量名为 co_fastlocalnames[i]。

注意 LOAD_CLOSURE 实际上是 LOAD_FAST 的一个别名。 它的存在是为了让字节码的可读性更好一些。

在 3.11 版本发生变更: i 不再是长度为 co_varnames 的偏移量。

LOAD_DEREF(i)¶

加载包含在 "fast locals" 存储的 i 号槽位中的单元。 将一个指向该单元所包含对象的引用推入栈。

在 3.11 版本发生变更: i 不再是 co_varnames 的长度的偏移量。

LOAD_FROM_DICT_OR_DEREF(i)¶

从栈中弹出一个映射并查找与该映射中的“快速本地”存储的槽位 i 相关联的名称。 如果未在其中找到此名称,则从槽位 i 中包含的单元中加载它,与 LOAD_DEREF 类似。 这被用于加载类语句体中的自由变量 (在此之前使用是 LOAD_CLASSDEREF) 和类语句体中的 标注作用域。

在 3.12 版本加入.

STORE_DEREF(i)¶

将 STACK.pop() 存放到 "fast locals" 存储中包含在 i 号槽位的单元内。

在 3.11 版本发生变更: i 不再是 co_varnames 的长度的偏移量。

DELETE_DEREF(i)¶

清空 "fast locals" 存储中包含在 i 号槽位的单元。 被用于 del 语句。

在 3.2 版本加入.

在 3.11 版本发生变更: i 不再是 co_varnames 的长度的偏移量。

COPY_FREE_VARS(n)¶

将 n 个自由变量从闭包拷贝到帧中。 当调用闭包时不再需要调用方添加特殊的代码。

在 3.11 版本加入.

RAISE_VARARGS(argc)¶

使用 raise 语句的 3 种形式之一引发异常,具体形式取决于 argc 的值:

0: raise (重新引发之前的异常)

1: raise STACK[-1] (在 STACK[-1] 上引发异常实例或类型)

2: raise STACK[-2] from STACK[-1] (在 STACK[-2] 上引发异常实例或类型并将 __cause__ 设为 STACK[-1] )

CALL(argc)¶

调用一个可调用对象并传入由 argc 所指定数量的参数,包括之前的 KW_NAMES 所指定的关键字参数,如果有的话。 在栈上(按升序排列),可以是:

NULL

可调用对象

位置参数

关键字参数

或者:

可调用对象

self

其余的位置参数

关键字参数

argc 是位置和关键字参数的总和,当未提供 NULL 时将排除 self。

CALL 将把所有参数和可调用对象弹出栈,附带这些参数调用该可调用对象,并将该可调用对象的返回值推入栈。

在 3.11 版本加入.

CALL_FUNCTION_EX(flags)¶

调用一个可调用对象并附带位置参数和关键字参数变量集合。 如果设置了 flags 的最低位,则栈顶包含一个由额外关键字参数组成的映射对象。 在调用该可调用对象之前,映射对象和可迭代对象会被分别“解包”并将它们的内容分别作为关键字参数和位置参数传入。 CALL_FUNCTION_EX 会中栈中弹出所有参数及可调用对象,附带这些参数调用该可调用对象,并将可调用对象所返回的返回值推入栈顶。

在 3.6 版本加入.

PUSH_NULL¶

将一个 NULL 推入栈。 在调用序列中用来匹配 LOAD_METHOD 针对非方法调用推入栈的 NULL。

在 3.11 版本加入.

KW_NAMES(consti)¶

向 CALL 添加前缀。 将指向 co_consts[consti] 的引用存入一个内部变量供 CALL 使用。 co_consts[consti] 必须为一个字符串元组。

在 3.11 版本加入.

MAKE_FUNCTION(flags)¶

将一个新函数对象推入栈顶。 从底端到顶端,如果参数带有指定的旗标值则所使用的栈必须由这些值组成。

0x01 一个默认值的元组,用于按位置排序的仅限位置形参以及位置或关键字形参

0x02 一个仅限关键字形参的默认值的字典

0x04 一个包含形参标注的字符串元组。

0x08 一个包含用于自由变量的单元的元组,生成一个闭包

与函数 (在 STACK[-1] ) 相关联的代码

在 3.10 版本发生变更: 旗标值 0x04 是一个字符串元组而非字典。

在 3.11 版本发生变更: 位于 STACK[-1] 的限定名称已被移除。

BUILD_SLICE(argc)¶

将一个切片对象推入栈中, argc 必须为2或3。 如果其为2,则实现:

end = STACK.pop()

start = STACK.pop()

STACK.append(slice(start, stop))

如果其为3,则实现:

step = STACK.pop()

end = STACK.pop()

start = STACK.pop()

STACK.append(slice(start, end, step))

详见内置函数 slice() 。

EXTENDED_ARG(ext)¶

为任意带有大到无法放入默认的单字节的参数的操作码添加前缀。 ext 存放一个附加字节作为参数中的高比特位。 对于每个操作码,最多允许三个 EXTENDED_ARG 前缀,构成两字节到三字节的参数。

FORMAT_VALUE(flags)¶

用于实现格式化字面值字符串(f-字符串)。 从栈中弹出一个可选的 fmt_spec,然后是一个必须的 value。 flags 的解读方式如下:

(flags & 0x03) == 0x00: value 按原样格式化。

(flags & 0x03) == 0x01: 在格式化 value 之前调用其 str()。

(flags & 0x03) == 0x02: 在格式化 value 之前调用其 repr()。

(flags & 0x03) == 0x03: 在格式化 value 之前调用其 ascii()。

(flags & 0x04) == 0x04: 从栈中弹出 fmt_spec 并使用它,否则使用空的 fmt_spec。

使用 PyObject_Format() 执行格式化。 结果会被推入栈顶。

在 3.6 版本加入.

MATCH_CLASS(count)¶

STACK[-1] 是一个由关键字属性名称组成的元组,STACK[-2] 是要匹配的类, 而 STACK[-3] 是匹配的目标主题。 count 是位置子模式的数量。

弹出 STACK[-1]、STACK[-2] 和 STACK[-3]。 如果 STACK[-3] 是 STACK[-2] 的实例并且具有 count 和 STACK[-1] 所要求的位置和关键字属性,则推入一个由已提取属性组成的元组。 在其他情况下,则推入 None。

在 3.10 版本加入.

在 3.11 版本发生变更: 在之前的版本中,该指令还会推入一个表示成功 (True) 或失败 (False) 的布尔值。

RESUME(where)¶

空操作。 执行内部追踪、调试和优化检查。

where 操作数标记 RESUME 在哪里发生:

0 在函数的开头。 函数不能是生成器、协程或者异步生成器。

1 在 yield 表达式之后

2 在 yield from 表达式之后

3 在 await 表达式之后

在 3.11 版本加入.

RETURN_GENERATOR¶

从当前帧中创建一个生成器,协程,或者异步生成器。 被用作上述可调用对象的代码对象第一个操作码。 清除当前帧,返回新创建的生成器。

在 3.11 版本加入.

SEND(delta)¶

等价于 STACK[-1] = STACK[-2].send(STACK[-1]) 。 被用于 yield from 和 await 语句。

如果调用引发了 StopIteration,则从栈中弹出最上面的值,推入异常的 value 属性,并将字节码计数器值递增 delta。

在 3.11 版本加入.

HAVE_ARGUMENT¶

这不是一个真正的操作码。 它是 [0,255] 范围内使用与不使用参数的操作码(分别是 < HAVE_ARGUMENT 和 >= HAVE_ARGUMENT )的分界线。

如果你的应用程序使用了伪指令,请使用 hasarg 作为替代。

在 3.6 版本发生变更: 现在每条指令都带有参数,但操作码 < HAVE_ARGUMENT 会忽略它。 之前仅限操作码 >= HAVE_ARGUMENT 带有参数。

在 3.12 版本发生变更: 伪指令被添加到 dis 模块中,对于它们来说,“比较 HAVE_ARGUMENT 以确定其是否使用参数”不再有效。

CALL_INTRINSIC_1¶

调用内联的函数并附带一个参数。 传入 STACK[-1] 作为参数并将 STACK[-1] 设为结果。 用于实现对性能不敏感的功能。

调用哪个内置函数取决于操作数:

操作数

描述

INTRINSIC_1_INVALID

无效

INTRINSIC_PRINT

将参数打印到标准输出。 被用于 REPL 。

INTRINSIC_IMPORT_STAR

为指定模块执行 import * 。

INTRINSIC_STOPITERATION_ERROR

从 StopIteration 异常中提取返回值。

INTRINSIC_ASYNC_GEN_WRAP

包裹一个异步生成器值

INTRINSIC_UNARY_POSITIVE

执行单目运算符 +

INTRINSIC_LIST_TO_TUPLE

将一个列表转换为元组

INTRINSIC_TYPEVAR

创建一个 typing.TypeVar

INTRINSIC_PARAMSPEC

创建一个 typing.ParamSpec

INTRINSIC_TYPEVARTUPLE

创建一个 typing.TypeVarTuple

INTRINSIC_SUBSCRIPT_GENERIC

返回 typing.Generic 取参数下标。

INTRINSIC_TYPEALIAS

创建一个 typing.TypeAliasType ;被用于 type 语句。 参数是一个由类型别名的名称、类型形参和值组成的元组。

在 3.12 版本加入.

CALL_INTRINSIC_2¶

调用内联的函数并附带两个参数。 用于实现对性能不敏感的功能:

arg2 = STACK.pop()

arg1 = STACK.pop()

result = intrinsic2(arg1, arg2)

STACK.push(result)

调用哪个内置函数取决于操作数:

操作数

描述

INTRINSIC_2_INVALID

无效

INTRINSIC_PREP_RERAISE_STAR

计算 ExceptionGroup 以从 try-except* 中引发异常。

INTRINSIC_TYPEVAR_WITH_BOUND

创建一个带范围的 typing.TypeVar 。

INTRINSIC_TYPEVAR_WITH_CONSTRAINTS

创建一个带约束的 typing.TypeVar 。

INTRINSIC_SET_FUNCTION_TYPE_PARAMS

为一个函数设置 __type_params__ 属性。

在 3.12 版本加入.

伪指令

这些操作码并不出现在 Python 的字节码之中。 它们被编译器所使用,但在生成字节码之前会被替代成真正的操作码。

SETUP_FINALLY(target)¶

为下面的代码块设置一个异常处理句柄。 如果发生异常,值栈的级别将恢复到当前状态并将控制权移交给位于 target 的异常处理句柄。

SETUP_CLEANUP(target)¶

与 SETUP_FINALLY 类似,但在出现异常的情况下也会将最后一条指令 (lasti) 推入栈以便 RERAISE 能恢复它。 如果出现异常,栈级别值和帧上的最后一条指令将恢复为其当前状态,控制权将转移到 target 上的异常处理句柄。

SETUP_WITH(target)¶

与 SETUP_CLEANUP 类似,但在出现异常的情况下会从栈中再弹出一项然后将控制权转移到 target 上的异常处理句柄。

该变体形式用于 with 和 async with 结构,它们会将上下文管理器的 __enter__() 或 __aenter__() 的返回值推入栈。

POP_BLOCK¶

标记与最后一个 SETUP_FINALLY、SETUP_CLEANUP 或 SETUP_WITH 相关联的代码块的结束。

JUMP¶

JUMP_NO_INTERRUPT¶

非定向相对跳转指令会被汇编器转换为它们定向版本( forward/backward )

LOAD_METHOD¶

经优化的非绑定方法查找。 以在 arg 中设置了旗标的 LOAD_ATTR 操作码的形式发出。

操作码集合¶

提供这些集合用于字节码指令的自动内省:

在 3.12 版本发生变更: 现在此集合还包含一些伪指令和工具化指令。 这些操作码的值 >= MIN_PSEUDO_OPCODE 和 >= MIN_INSTRUMENTED_OPCODE。

dis.opname¶

操作名称的序列,可使用字节码来索引。

dis.opmap¶

映射操作名称到字节码的字典

dis.cmp_op¶

所有比较操作名称的序列。

dis.hasarg¶

所有使用参数的字节码的序列

在 3.12 版本加入.

dis.hasconst¶

访问常量的字节码序列。

dis.hasfree¶

访问了 free 变量的字节码的序列。 这里的 ‘free’ 指的是当前作用域中被内层作用域引用的名称或外层作用域被当前作用域引用的名称。 它 不包括 全局或内置作用域的引用。

dis.hasname¶

按名称访问属性的字节码序列。

dis.hasjrel¶

具有相对跳转目标的字节码序列。

dis.hasjabs¶

具有绝对跳转目标的字节码序列。

dis.haslocal¶

访问局部变量的字节码序列。

dis.hascompare¶

布尔运算的字节码序列。

dis.hasexc¶

设置一个异常处理句柄的字节码序列。

在 3.12 版本加入.

目录

dis --- Python 字节码反汇编器

命令行接口

字节码分析

分析函数

Python字节码说明

操作码集合

上一主题

compileall --- 字节编译 Python 库

下一主题

pickletools --- pickle 开发者工具集

当前页面

报告 Bug

显示源码

«

导航

索引

模块 |

下一页 |

上一页 |

Python »

3.12.2 Documentation »

Python 标准库 »

Python 语言服务 »

dis --- Python 字节码反汇编器

|

Theme

Auto

Light

Dark

|

© 版权所有 2001-2024, Python Software Foundation.

This page is licensed under the Python Software Foundation License Version 2.

Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.

See History and License for more information.

The Python Software Foundation is a non-profit corporation.

Please donate.

最后更新于 Mar 06, 2024 (12:34 UTC).

Found a bug?

由 Sphinx 7.2.6创建。