HiKariのTechLab

光の技术屋


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 站点地图

  • 搜索

【Python随笔】如何提取python函数的接口定义信息

发表于 2021-12-12 | 更新于 2024-04-07 | 分类于 Python随笔

在某些python框架底层的开发需求中,需要通过一些类似反射的手段,提取函数接口的信息,从而对一系列函数接口进行管理。本篇文章就来粗浅谈一下,如何提取python函数的接口定义信息。

function对象的信息

首先我们拿一个函数来试试手:

1
2
3
4
5
def myprinter(s: str, /, e: str = '\n', *, prefix: Any = '') -> Tuple[bool, str]:
"""hello world"""
msg = str(prefix) + s + e
print(msg, end='')
return True, msg

这个函数myprinter采用了新的语法糖/以及*,/的左边表示强制位置参数(positional-only arguments),*的右边表示强制关键字参数(keyword-only arguments),而两者中间的参数在使用时以位置参数或者是关键字参数的形式表达都可以。

要提取这个函数的信息,我们首先要知道函数本身也是一种对象。因此,可以用到dir函数,遍历这个对象的属性,从而提取所有属性的值。

通过dir导出函数对象的属性与值,打印的结果如下:

阅读全文 »

【游戏开发】踩坑UE4的Python脚本插件

发表于 2021-11-21 | 更新于 2024-04-07 | 分类于 游戏开发

UE4以C++为基础,在游戏开发需求当中,官方推崇的是Blueprint可视化编程,而除此之外像UnLua、puerts等解决方案也提供了lua、ts等其它脚本语言的支持。至于python,UE4本身就有插件支持,叫做PythonScriptPlugin,启用插件后,在编辑器里,可以输入python代码执行一系列命令。在最新的4.27版本中,python的版本是3.7.7。

回到正题,之所以这篇文章标题叫踩坑,是因为真的踩坑了——尝试用PythonScriptPlugin来编写UE4的游戏逻辑,最终放弃。PythonScriptPlugin适合做一些驱动编辑器的操作,或者是做一些静态资源检查相关的工作(其实这个插件真名就叫Python Editor Script Plugin),如果用它来写游戏逻辑的话,很多必须的内容都难以支持。但不管怎么说,既然踩坑了还是要分享点东西出来,因此这篇文章先粗浅谈一下PythonScriptPlugin的工作流。

阅读全文 »

【Medium Python】最终话:如何彻底理解with关键字的用法?

发表于 2021-11-13 | 更新于 2024-04-07 | 分类于 Medium Python

Medium Python终于来到了最终话。经历了前四话的撰写,笔者决定以第五话作为收尾,故这段时间一直在思考python里还有什么内容是我们常见但值得推敲且有应用意义的点。绞尽脑汁,最终得到了今天这个主题:with关键字。

with关键字的含义,是笔者接触python以来希望彻底搞懂的问题之一,也是一定会困惑大量玩python的同学的问题之一。相信每一个玩过python的同学都接触过with语法,比如with open(xxx) as f的文件操作,或者是with lock这样的加解锁操作,这些东西每个python教程里都有。但是with语法具体表示什么,具体能够翻译成怎样的简单语法,基本没啥人能够说的清楚,说的科学。即便在网上有许多文章在剖析这一点,提到了许多诸如“上下文管理(context manager)”、“异常处理”、“__enter__、__exit__”之类的词汇,但是就正因为缺少些硬核的东西,比如源码分析,导致许多个文章的内容都很水,看了也不能完完全全的明白,实际写代码的时候也觉得难以彻底掌握。

因此,为了把这件事情说明白,本文决定继续源码分析的套路,让大伙儿彻底理解with关键字是怎么一回事。老样子,一切的吹水都没有源码分析来的实在。看完这篇文章,其它关于with的文章都可以统统无视了。

with代码测试

首先我们上一段测试代码:

阅读全文 »

【Medium Python】第四话:类属性和实例属性是怎样的关系?

发表于 2021-11-06 | 更新于 2024-04-07 | 分类于 Medium Python

前言

提到编程不得不提到面向对象,一个说烂了的话题,几十年来一直都有人在争论面向对象的好坏。从宏观角度来说,一个庞大的程序本质是对业务中实体集合以及其中的关系的模拟,虽然解决实体的关系问题,用面向过程、组合等方式去体现比较方便,但要解决实体概念的抽象,就需要面向对象的编程基础。因此,面向对象在编程中是非常重要的一部分思想,不能随随便便被否定或者忽略。

​
面向对象的灵魂在于对类(class)概念的剖析,而python中也有对类的支持,虽然不像其它静态语言有比较强的约束,但如果想将代码组织成面向对象式的话也是完全满足的。在平常python的交流以及面试的过程中,也会涉及到许多关于类的问题,比如最常见的就是阐述类与实例的关系。要理解类与实例的关系,从类属性和实例属性切入是为最直观的。因此,今天这篇文章就来讲讲python里类属性和实例属性的二三事。
​

在类和实例中访问属性

首先上一段测试代码:

阅读全文 »

【Medium Python】第三话:python多线程为什么不能并行?

发表于 2021-10-30 | 更新于 2024-04-07 | 分类于 Medium Python

python的多线程,这是个老生常谈的话题了,网上资料也一大把。python默认的threading模块对多线程提供了支持,但实际多个threading.Thread实例无法并行运行(不是无法并发哦!)。
​
一句话概括答案:python的线程实质是操作系统原生的线程,而每个线程要执行python代码的话,需要获得对应代码解释器的锁GIL。一般我们运行python程序都只有一个解释器,这样不同线程需要获得同一个锁才能执行各自的代码,互斥了,于是代码就不能同时运行了。
​
好的,接下来我们细细讲解这句话背后的故事:

多线程并行测试

首先我们通过一些代码来测试多线程是否真的并行:

阅读全文 »

【Medium Python】第二话:dict的keys()返回了什么数据类型?

发表于 2021-10-23 | 更新于 2024-04-07 | 分类于 Medium Python

在python3里面,我们经常会用if k in d.keys()来判断某个key是不是在某个dict里面,或者是用a_dict.keys() - b_dict.keys()来获取两个字典之间keys的差集。那么这里就有一个问题,dict的keys()返回了什么数据类型呢?

list?set?两者都是错误答案。Don’t say so much,打印一下type,发现是这么个数据类型:<class 'dict_keys'>

dict_keys是什么东西?

在python dict数据结构定义中(dictobject.c),可以看到dict_keys的定义

阅读全文 »

【极客日常】一种解决redis源码编译时jemalloc报No such file or directory错误的方法

发表于 2021-10-19 | 更新于 2024-04-07 | 分类于 极客日常

在用源码编译redis的过程中,可能会报jemalloc出错,提示No such file or directory的问题,导致构建不能继续。一种常见的,在网上流传的方法是调整MALLOC参数为libc,但这并不是唯一解,不能一概而论。

以笔者的例子,笔者采用windows装CLion并用Remote Development连接linux虚拟机的方式来编译redis源码,版本为6.2.6,在构建的过程中也报了jemalloc出No such file or directory的问题。在笔者的场景下,仔细查看日志,会出现许多Permission Denied的字样,这说明有许多脚本没有执行权限。经过一番研究,执行下面俩操作之后,distclean一下,就能成功再次编译redis。

  • 在src目录下,chmod +x ./mkreleasehdr.sh,增加这个脚本的执行权限
  • 在deps目录下,chmod -R 777 jemalloc,把jemalloc目录下所有文件权限都提上来

暂时研究到的是这些,如果真是因为权限问题,且还有漏网之鱼的话,极端一点可以把整个redis源码目录权限都提上来。反正都可以试试看。

【Medium Python】第一话:为什么list“可变”,而tuple“不可变”?

发表于 2021-10-17 | 更新于 2024-04-07 | 分类于 Medium Python

前言

python面试有一道很基础的问题:list(列表)和tuple(元组)有什么不同?基本上只要背过题库的同学都知道,list(里面的元素)是可变的,tuple(里面的元素)是不可变的。

我们尝试在python解释器中改变tuple的元素(赋另一个值),会有以下的表现:

1
2
3
4
5
6
7
8
9
10
11
12
def tuple_check():
tp = ('123', 123)
tp[1] = 13

"""
Traceback (most recent call last):
File "H:/Projects/Python/playground/main.py", line 20, in <module>
tuple_check()
File "H:/Projects/Python/playground/main.py", line 10, in tuple_check
tp[2] = 13
TypeError: 'tuple' object does not support item assignment
"""

可以看到赋值操作报错,tuple不支持再次赋值,体现了其“不可变”的特性。

但是,不支持赋值/不可变的原因,到底是什么呢?不是说不支持就不支持吧!难道也没有支持的可能?

这个问题要给出清晰的答案可并不容易,如果你直接检索网上资料的话,会发现很多文章都在说重复的话,没有什么深入的挖掘,导致这个问题无从解释。于是,今天这篇文章,就给大家把这个问题讲的干脆一点。

以及,看完这篇文章之后,网上那些车轱辘话大家也就没有必要再看了。

阅读全文 »

【Medium Python】前言

发表于 2021-10-10 | 更新于 2024-04-07 | 分类于 Medium Python

python作为最流行的语言之一,我们对python的认知到底有多少呢?大胆猜测,95%的同学对python的了解都不超过5%吧!不用说python的c源码了,就算是python每个标准库的.py源码,都有很少人去关心。结论就是,我们对python本身的理解是远远不够的,比想象中还不够!当然,这也可能是python的语言特性导致的吧,在设计方面就不需要我们去多想。

python的岗位众多,网上的教材跟面试题也很多,然而很多都是八股文,浅尝辄止,鲜有深度的挖掘,让人知其然而不知其所以然,处处透露着对技术的不敬!想想看,游戏程序员学lua,一些C Library的实现、Lua底层机理都需要熟悉,python比lua应用会更加广泛,为什么就不可以去熟悉类似的东西呢?python的应用场景那么多,不去深入了解这门语言的实现,怎么能够更好掌控这门语言?怎么可能做出更加优秀的产品?

因此笔者决定,从一些所谓的python面试题出发,通过源码分析的方法,挖掘其思路与实现,让更多人对python有更加深入的了解。这个系列,会把一些本该属于python教程里的东西给展现出来,取名就叫做Medium Python——因为笔者刚出道(谈恋爱)时,已经写过Easy Python,里面罗列了些python的简单知识。至于未来有没有Hard Python,到时候再说吧!

Contents

  • 【Medium Python】第一话:为什么list“可变”,而tuple“不可变”?
  • 【Medium Python】第二话:dict的keys()返回了什么数据类型?
  • 【Medium Python】第三话:python多线程为什么不能并行?
  • 【Medium Python】第四话:类属性和实例属性是怎样的关系?
  • 【Medium Python】最终话:如何彻底理解with关键字的用法?

【Python随笔】如何访问类实例里带双下划线的属性

发表于 2021-10-06 | 更新于 2024-11-03 | 分类于 Python随笔

学过python的我们都知道在python的类实例instance的__init__函数里,可以初始化这个instance的属性。属性的命名有许多种,比如有一个例子:

1
2
3
4
5
class Student:
def __init__(self, name, gender, age):
self.name = name
self._gender = gender
self.__age = age

这三种属性名分别是:不带下划线、带一个下划线、带两个下划线

假设有一个类Student的实例student,我们通过访问student.name、student._gender,是能够获得对应属性值的,但访问student.__age却报了如下错误:

阅读全文 »
1…111213…21
ひかり.HDQ

ひかり.HDQ

talk is cheap, code is rich
203 日志
14 分类
423 标签
GitHub Mail CSDN Juejin Steam Bilibili
© 2019 – 2025 ひかり.HDQ
|