python不好用怎么办_那些用起来很爽,但用不好可能会被人打的Python骚操作

这个操作偶尔会在处理一些私有协议或者奇葩平台的接口时用到,就是对方给你返回的内容可能是这么一个嵌套列表,子列表的第一个值是key、后面的部分是value,然后有些奇葩点的平台可能连子列表的顺序都不相同。

这种时候如果用这个操作去取key和value的话,就会方便很多,你不需要管它的value到底有多少个,也不需要按下标0去取嵌套列表中的key,你只需要直接这么for一下然后处理key和value就完事了。

>>> {key:values forkey, *values inresult}{ 'items': [ 'item1', 'item2', 'item3'], 'status': [ 1]}

甚至你还可以直接把这个代码写成一行,直接将它们转成字典再做后续的处理。

快速解压一个字典,并将它里面的key和value们分别赋值给不同的变量

>>> a = { "key1": "value1", "key2": "value2", "key3": "value3"}>>> (key1, value1), (key2, value2), (key3, value3) = a.items>>> key1'key1'>>> value1'value1'>>> key2'key2'>>> value2'value2'

这个操作的用途也是对于爬虫工程师和后端工程师而言会比较常见,比如说:

你需要提取一个接口返回的带有状态码、状态信息和data的内容,并且你需要判断一下状态码是不是代表请求成功的那个,这时候如果是一个一个通过key去取值、赋值的话就会很麻烦,但如果你用这个操作的话,就可以快速解决。

可能光是这么说不太直观,看一段样例代码吧:

>>> result = { "code": 200, "data": { "balabala": 111}, "msg": None}>>> (_, code), (_, data), (_, msg) = result.items>>> code200>>> data{ 'balabala': 111}>>> msg>>>

当然这个操作也不能乱用,在使用这个操作时,你需要确保字典中key的顺序严格一致,否则就可能会出现提取到错误内容的情况,所以提取之前为了防止顺序错乱,可以先按key做个排序,以确保顺序是严格一致的。

然后字典中的内容是否会有变化也是需要考虑的,如果你写的代码需要非常严谨,那就还是老老实实地按key一个一个取吧,毕竟如果这里面多了一个key在中间位置,取到的东西就会完全不同。

动态构建出Python中的各种运算符

这个操作是基于Python标准库之一的operator库做的,它可以实现各种比较运算、逻辑运算、数学运算、序列运算。由于这个库里的东西比较多,所以我们这里看个图就好,不多赘述了,大家可以后面自己看看官方文档。

然后用途的话,举个例子,比如你是一个爬虫工程师,你想弄一个纯图形化界面采集数据的工具,然后这时候你可能会碰到某些平台(网站和APP的统称)的内容较为复杂,有些字符串需要按下标取出特定部分的内容,这时候你就可以通过 operator.getitem(str, slice(start, end)) 来取,这里的 start 和 end 就直接在工具的界面上填写或选择出来就好了。

>>> importoperator>>> a = "666111666">>> operator.getitem(a, slice( 3, 6))'111'

动态创建函数

有时候你可能会碰到类似这样的特殊情况:你有一些不同的值需要通过处理方式相同的函数进行处理,但由于条件限制你还不能将这个函数归纳为一个并通过传参的方式进行处理,只能是写出多个不同名称的函数来分别处理。

或者你可能就是单纯有个需求需要动态创建一个临时函数来使用。

这时候如果使用这个操作的话,就可以很轻松地解决这个问题,只需要像这样就可以动态地创建出一个函数了:

>>> fromtypes importFunctionType>>>>>> func = FunctionType(compile(... ( "def func:n"... " print(1)n"... " return 2"),... "",... "exec"... ).co_consts[ 0], globals)>>> print(func)12

注:这里面用括号包起来的字符串会自动进行拼接,属于Python中多行字符串的写法之一,优点是不会因为像三个引号那样会因为缩进导致字符串内容受影响。如果想了解更多可以自行查看Python官方文档,里面的字符串部分有讲这个小技巧。

我们还可以对里面那个函数代码字符串进行动态生成(比如用format),以实现对函数名和内容的修改,甚至我们还可以通过使用像Jinja这种模板渲染库来实现更方便的函数代码生成。

像我前段时间写那篇发票整理工具的文章时,就碰到了前面说的那个特殊情况,由于Django Admin的那个action函数的参数是固定的,并且如果需要传参给action函数的话就需要通过中间页来实现,而我既不想弄中间页、又有好几个不同的参数需要分别处理,于是就直接采用动态创建函数的方式来解决了。

动态导入

有时候你可能会有一些扩展代码之类的需要在运行时动态地被导入,这时候你就可以用上这个操作了,比如说我们需要导入operator这个库:

>>> importimportlib>>>>>> module= importlib.import_module( "operator")然后这个module变量就是被导入后的模块名称了,我们可以直接和正常导入时一样使用,比如我们要调用它的add函数:

>>> module.add( 1, 1) # 加法运算符2

动态调用

有时候你在动态导入之后,还会需要进行动态调用,这时候你就可以这样:

>>> importimportlib>>>>>> module= importlib.import_module( "operator")>>> func = getattr( module, "add")>>> func( 1, 1)2

当然,在使用动态创建、动态导入、动态调用这种比较Hack的操作的时候,一定要注意安全问题,就是如果你在使用时有部分参数是需要用户输入的的话,就一定要对输入内容进行检查,以免被利用来直接执行危险代码。

比如说你提供了一个动态创建函数的功能,如果没有检查内容的话,可能有些比较坏的人直接就通过os库之类的来调用命令行把你的机子给黑了,非常危险。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值