首页 > 编程语言 >在python代码中,写其他编程语言的hello world

在python代码中,写其他编程语言的hello world

时间:2023-01-30 17:35:17浏览次数:46  
标签:__ python 作用域 dict 模块 printf print world hello


1. hello world

不论哪种编程语言,在你最开始学习时,都会给你一个在终端输出hello world的示例

print("hello world")

这已经成为一种惯例,最近在github上闲逛时,偶遇了一个特别有趣的项目,这个作者实现了一个模块,可以让你在python代码里,使用其他编程语言的语法和关键字来编写hello world , 就像下面这样

import anyprint

printf("printf %d\n", 10) # c

fmt.Println("hello") # go

cout << "Hello, C++!" << endl # c++

这个项目的github地址是: https://github.com/kragniz/anyprint , 源码只有不到200行,真正核心的代码也只有20行。

2. 实现原理

刚看到这个库时,从它的示例代码中,我已经大致猜出了它的实现原理。

printf并不是python中的关键字,直接使用一定会报错的。这个函数一定是在anyprint 模块里实现了,但作者只是将anyprint引入(import anyprint ),而不是从anyprint模块里引入printf (from anyprint import printf),这说明,在anyprint模块里,已经将printf写入到内置作用域。

打开anyprint.py文件,在文件末尾有如下代码

def make_module(name, members):
m = types.ModuleType(name)
m.__name__ = name
for k, v in members.items():
if type(v) is dict:
m.__dict__[k] = make_module(k, v)
else:
m.__dict__[k] = v
return m


for k, v in prints.items():
if type(v) is dict:
globals()['__builtins__'][k] = make_module(k, v)
else:
globals()['__builtins__'][k] = v

globals函数以字典的形式返回全局作用域的变量,__builtins__ 所对应的value就是内置作用域模块,prints是一个字典,内容如下

prints = {
# go
'fmt': {
'Println': print,
'Printf': printf,
'Print': printn,
},

# java
'System': {
'out': {
'println': print,
'printf': printf,
},
# Visual Basic .NET
'Console': {
'Write': printn,
'WriteLine': print,
},
},

# kotlin
'println': print,

# C like
'printf': printf,
}

我以printf和fmt 为例,解释它如何工作的。在遍历prints时,如果key为printf,value是一个函数

printf = lambda *args: print(args[0] % args[1:], end='')

则执行

globals()['__builtins__'][k] = v   # 写入内置作用域

当你在脚本里使用printf时,如果局部作用域,内嵌作用域,全局作用域都找不到printf,则会去内置作用域里查找,而当前时刻,内置作用域里确实有pirntf,这个printf函数可以通过globals()[‘builtins’][‘printf’]获取到。

遍历prints时,如果key是fmt, 其value是一个字典,则执行

m.__dict__[k] = make_module(k, v)

我们来看make_module的实现

def make_module(name, members):
m = types.ModuleType(name)
m.__name__ = name
for k, v in members.items():
if type(v) is dict:
m.__dict__[k] = make_module(k, v)
else:
m.__dict__[k] = v
return m

函数首先会创建出一个名为fmt的模块,这个模块会被写入到内置模块,这样,就可以直接使用fmt了,fmt模块里,还有3个方法

{
'Println': print,
'Printf': printf,
'Print': printn,
}

再次进行遍历,将Println,Printf, Print 写入模块m的__dict__字典中,value就是事先准备好的print, printf, printn 函数,这样当你在代码里执行

fmt.Println("hello")

首先在内置模块里找到fmt模块,然后在fmt模块的__dict__字典中找到Println函数来执行。

再来看java部分的实现

'System': {
'out': {
'println': print,
'printf': printf,
},
# Visual Basic .NET
'Console': {
'Write': printn,
'WriteLine': print,
},
},

嵌套层级更深,但原理是一样的,创建一个名为System的模块,写入内置作用域,在System的__dict__字典里有一个名为out的模块,在out模块的__dict__字典里有一个println函数。

作者巧妙的利用了python的内置作用域,或是直接将函数写入内置作用域,或是创建相应的模块供用户使用。


标签:__,python,作用域,dict,模块,printf,print,world,hello
From: https://blog.51cto.com/u_15948370/6027506

相关文章

  • python 系统更新跟踪
    #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#需求:#动态捕获指定服务器最新发布接种应用系统路......
  • QT(c++) 线程 调用python问题
    1、背景简单说一下需求,Qt开发的上位机界面程序,需要调用Python编写的算法跑一个结果返回到界面上显示。2、度娘出一篇博客,按照步骤进行环境搭建和简单的代码测试......
  • Hello,World!
    Hello,World!随便新建一个文件夹,存放代码新建一个Java文件文件后缀名为.javaHello.java【注意点】系统可能没有显示文件后缀名,我们需要手动打开编写代......
  • 用python制作一个简单的zip压缩工具
    1.功能设计对文件或文件夹压缩,是日常工作中经常要做的事情,市面上也有非常多的压缩工具,在linux系统里,有zip,tar等命令可以用于压缩。最近学习了python的zipfile模块,它提供......
  • 掌握hashtable,深度理解python字典的数据结构
    文章目录​​1.hash函数​​​​2.hashtable​​​​2.1链地址法实现hashtable​​​​2.2解决冲突​​​​2.3开放寻址法实现hashtable​​​​2.4逻辑删除key​​​......
  • 忘掉python的os.path吧,pathlib巨好用
    1.pathlib取代os.path模块从python3.4开始,pathlib正式成为标准库,旨在取代老旧的os.path模块和一些os模块中对系统路径的操作。pathlib提供了表示文件系统路径的类,而os.pat......
  • python web框架多进程部署下数据库连接问题
    python常用的web框架,诸如flask,django,在生产部署时,都会选择多进程的部署方式,选用的中间件多为uwsgi或者gunicorn。如果项目里使用了数据库,那么就要考虑数据库连接在多进程下......
  • python使用正则表达式实现字符串替换
    python的字符串提供了replace方法,可以将子串替换成其他字符串,例如下面的代码name='flask_script'name=name.replace('_','-')print(name)#flask-script替换的前提......
  • C++子线程中调用python代码
    项目需要C++调用python的算法,由于python算法比较耗时,因此采用在C++里启动workingthread来调用python脚本,python代码里含有cv2.imread()等opencv的调用,在子线程里调用会卡......
  • 【Python笔记2.1】Python Unicode字符编解码
    以下部分参考[1],这里复制了其中一部分是为了防止原文被移动或删除。概述Python中有字符串类型(str)和字节类型(byte),以及Python编码中最常见也是最顽固的两个错误:Unic......