日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

逆向之旅:七個讓Python編程更糟糕的小技

來源: 責編: 時間:2024-05-07 09:11:38 184觀看
導讀文章帶大家進入Python編程的奇特角落,探索那些完全出乎意料甚至無厘頭的編程事實。在這里,你可以窺見如何在一行內完成復雜的函數,或者是如何完全無視掉代碼中的assert語句。如果你想在Python編程方面變得更糟糕,那么,這篇

文章帶大家進入Python編程的奇特角落,探索那些完全出乎意料甚至無厘頭的編程事實。在這里,你可以窺見如何在一行內完成復雜的函數,或者是如何完全無視掉代碼中的assert語句。DuQ28資訊網——每日最新資訊28at.com

DuQ28資訊網——每日最新資訊28at.com

如果你想在Python編程方面變得更糟糕,那么,這篇文章就是為你量身定制的。DuQ28資訊網——每日最新資訊28at.com

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

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

在一個類中,當1用于訪問someattribute屬性2時調用magic方法someattributes屬性沒有顯式定義__getattribute__object.someattribute。DuQ28資訊網——每日最新資訊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 函數,那么這點就適合你。假設有一個多行函數,但是并不知道如何才能合法地把它壓縮成一行代碼DuQ28資訊網——每日最新資訊28at.com

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

為了便于理解,這里有一個簡明易懂的例子。DuQ28資訊網——每日最新資訊28at.com

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

exec()會將字符串作為Python代碼來執行 因此,如果將函數編成字符串格式并把提供給exec,就成功地用python的一行代碼來寫出這個函數了DuQ28資訊網——每日最新資訊28at.com

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

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

目前得到了一個錯誤,這是因為默認情況下,是不能將一個對象像一個函數一樣去調用的。DuQ28資訊網——每日最新資訊28at.com

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

定義魔術方法__call__可以決定對象的調用行為,就像對函數進行調用一樣。DuQ28資訊網——每日最新資訊28at.com

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

在這,讓__call__返回一個新的 Dog 對象。DuQ28資訊網——每日最新資訊28at.com

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

由于每次都得到一個新的 Dog 對象,無論何時對Dog對象進行調用,都可以無限地調用下去。DuQ28資訊網——每日最新資訊28at.com

(4) 多個負號的問題

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

這是有效的 Python 代碼:DuQ28資訊網——每日最新資訊28at.com

  • 1-2可以被解讀為 1 減 2
  • -1則被看成負數(不是減法的負號)
  • --1是負負,就等于 1
  • ---1是負負負的,又變成了 -1
  • 這種情況就會一直持續下去

-1--2---3----4-----5:因此,這是合法的 Python 代碼-1-(-2)-(--3)-(---4)-(----5)DuQ28資訊網——每日最新資訊28at.com

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

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

在這,將print = None,將None賦值給了print。這覆蓋了非常熟悉的常用函數,因此我們現在無法使用print()。DuQ28資訊網——每日最新資訊28at.com

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

但可以用__builtins__.print來訪問原來的print()功能!DuQ28資訊網——每日最新資訊28at.com

print = None__builtins__ = None

如果讓__builtins__設置為None。現在沒有人能再使用 print() 了。DuQ28資訊網——每日最新資訊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語句。DuQ28資訊網——每日最新資訊28at.com

# hello.pyassert 1 == 2

如果用python hello.py來運行它,由于 assert 語句,會收到一個 AssertionError。DuQ28資訊網——每日最新資訊28at.com

# hello.pyassert 1 == 2
  • 也可以選擇用python -O hello.py來運行它
  • -O標志讓 Python 忽略所有的assert語句
  • 現在,可以讓你的代碼忽略所有 assert 語句,無論它們會捕獲何種錯誤!畢竟,誰在乎呢?

結論

文章帶大家進入Python編程的奇特角落,探索那些完全出乎意料甚至無厘頭的編程事實。在這里,你可以窺見如何在一行內完成復雜的函數,或者是如何完全無視掉代碼中的assert語句。DuQ28資訊網——每日最新資訊28at.com

如果你對編程充滿好奇或者想成為一個更糟糕的程序員,那么這篇文章將為你揭開一個被藏在細節里的驚人世界。DuQ28資訊網——每日最新資訊28at.com


DuQ28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-87002-0.html逆向之旅:七個讓Python編程更糟糕的小技

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 30秒內輕松檢測Python文件的變化

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 沂源县| 宜城市| 遵化市| 温宿县| 始兴县| 罗平县| 株洲县| 定日县| 东兰县| 枣庄市| 应用必备| 喀什市| 千阳县| 泗洪县| 峨边| 阳朔县| 视频| 蒲江县| 朔州市| 丹凤县| 郯城县| 宝鸡市| 藁城市| 蒙城县| 宜城市| 襄樊市| 彭州市| 桂东县| 马龙县| 资源县| 秦皇岛市| 丹阳市| 东明县| 江都市| 石狮市| 高尔夫| 道孚县| 辉县市| 遂川县| 临漳县| 马尔康县|