当前位置:首页 > 科技  > 软件

逆向之旅:七个让Python编程更糟糕的小技

来源: 责编: 时间:2024-05-07 09:11:38 263观看
导读文章带大家进入Python编程的奇特角落,探索那些完全出乎意料甚至无厘头的编程事实。在这里,你可以窥见如何在一行内完成复杂的函数,或者是如何完全无视掉代码中的assert语句。如果你想在Python编程方面变得更糟糕,那么,这篇

文章带大家进入Python编程的奇特角落,探索那些完全出乎意料甚至无厘头的编程事实。在这里,你可以窥见如何在一行内完成复杂的函数,或者是如何完全无视掉代码中的assert语句。qJC28资讯网——每日最新资讯28at.com

qJC28资讯网——每日最新资讯28at.com

如果你想在Python编程方面变得更糟糕,那么,这篇文章就是为你量身定制的。qJC28资讯网——每日最新资讯28at.com

(1) _.__.___.____._____ 也能行

class Test:    def __getattr__(self, key):        return Test()

在一个类中,当1用于访问someattribute属性2时调用magic方法someattributes属性没有显式定义__getattribute__object.someattribute。qJC28资讯网——每日最新资讯28at.com

class Test:    def __getattr__(self, key):        return Test()_ = Test()print(_)print(_.__)print(_.__.___)print(_.__.___.____)print(_.__.___.____._____)# <__main__.Test object at 0x1098834d0># <__main__.Test object at 0x109883500># <__main__.Test object at 0x1098835c0># <__main__.Test object at 0x1098835c0># <__main__.Test object at 0x109883500>
  • _就是一个测试类对象
  • _.__调用,返回另一个 Test 对象__getattr__
  • _.__.___又一次调用,返回另一个Test 对象__getattr__
  • _.__.___.____再一次调用,返回另一个Test 对象__getattr__
  • _.__.___.____._____继续调用,返回另一个Test 对象__getattr__
  • 这就是可能的_.__.___.____._____

(2) 利用exec()在一行中写代码

如果你曾经想要学的是如何在一行代码中写出任何 Python 函数,那么这点就适合你。假设有一个多行函数,但是并不知道如何才能合法地把它压缩成一行代码qJC28资讯网——每日最新资讯28at.com

def hi():    print('apple')    print('orange')

为了便于理解,这里有一个简明易懂的例子。qJC28资讯网——每日最新资讯28at.com

exec("def hi():/n. print('apple')/n  print('orange')")

exec()会将字符串作为Python代码来执行 因此,如果将函数编成字符串格式并把提供给exec,就成功地用python的一行代码来写出这个函数了qJC28资讯网——每日最新资讯28at.com

(3) Dog()()()()可以是有效代码

class Dog:    passdog = Dog()print(dog())  # error

目前得到了一个错误,这是因为默认情况下,是不能将一个对象像一个函数一样去调用的。qJC28资讯网——每日最新资讯28at.com

class Dog:    def __call__(self):        return 'apple pie'dog = Dog()print(dog())  # apple pie

定义魔术方法__call__可以决定对象的调用行为,就像对函数进行调用一样。qJC28资讯网——每日最新资讯28at.com

class Dog:    def __call__(self):        return Dog()dog = Dog()print(dog())  # <class '__main__.Dog'>

在这,让__call__返回一个新的 Dog 对象。qJC28资讯网——每日最新资讯28at.com

print(Dog()()()()())

由于每次都得到一个新的 Dog 对象,无论何时对Dog对象进行调用,都可以无限地调用下去。qJC28资讯网——每日最新资讯28at.com

(4) 多个负号的问题

x = -1--2---3----4-----5

这是有效的 Python 代码:qJC28资讯网——每日最新资讯28at.com

  • 1-2可以被解读为 1 减 2
  • -1则被看成负数(不是减法的负号)
  • --1是负负,就等于 1
  • ---1是负负负的,又变成了 -1
  • 这种情况就会一直持续下去

-1--2---3----4-----5:因此,这是合法的 Python 代码-1-(-2)-(--3)-(---4)-(----5)qJC28资讯网——每日最新资讯28at.com

(5)如何限制使用print()

print = Noneprint('hello world')# TypeError: 'NoneType' object is not callable

在这,将print = None,将None赋值给了print。这覆盖了非常熟悉的常用函数,因此我们现在无法使用print()。qJC28资讯网——每日最新资讯28at.com

print = None__builtins__.print('hello')  # hello

但可以用__builtins__.print来访问原来的print()功能!qJC28资讯网——每日最新资讯28at.com

print = None__builtins__ = None

如果让__builtins__设置为None。现在没有人能再使用 print() 了。qJC28资讯网——每日最新资讯28at.com

(6)让全局变量都消失

a = 4b = 5c = 6keys = list(globals().keys())for key in keys:    del globals()[key]del globals()['keys']del globals()['key']print(globals())  # {}print(a)  # 'a' 没有定义
  • globals()会返回含有所有全局变量的字典
  • 可以删掉所有在globals()中的键值对
  • 删完后,globals()变成了空的
  • 这意味着没有剩余的全局变量,并且之前定义的所有全局变量都一去不复返了

(7)可无视assert语句

你是不是经常assert代码语句困扰?别担心,因为有一种方法能让你完全无视掉assert语句。qJC28资讯网——每日最新资讯28at.com

# hello.pyassert 1 == 2

如果用python hello.py来运行它,由于 assert 语句,会收到一个 AssertionError。qJC28资讯网——每日最新资讯28at.com

# hello.pyassert 1 == 2
  • 也可以选择用python -O hello.py来运行它
  • -O标志让 Python 忽略所有的assert语句
  • 现在,可以让你的代码忽略所有 assert 语句,无论它们会捕获何种错误!毕竟,谁在乎呢?

结论

文章带大家进入Python编程的奇特角落,探索那些完全出乎意料甚至无厘头的编程事实。在这里,你可以窥见如何在一行内完成复杂的函数,或者是如何完全无视掉代码中的assert语句。qJC28资讯网——每日最新资讯28at.com

如果你对编程充满好奇或者想成为一个更糟糕的程序员,那么这篇文章将为你揭开一个被藏在细节里的惊人世界。qJC28资讯网——每日最新资讯28at.com


qJC28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-87002-0.html逆向之旅:七个让Python编程更糟糕的小技

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 30秒内轻松检测Python文件的变化

下一篇: TypeScript 中的 Extends 怎么那么优秀啊?

标签:
  • 热门焦点
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾&ldquo;低价&rdquo;口号。而过去与他们错位竞争的拼多多,靠
  • 网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • 华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    北京时间2月27日晚,华为在巴塞罗那举行春季智慧办公新品发布会,在海外市场推出之前已经在中国市场上市的笔记本、平板、激光打印机等办公产品,并首次推出搭载
Top