Python黑科技:FuckIt.py

Python之禪發表於2018-09-04

說起 Python 強大的地方,你可能想到是它的優雅、簡潔、開發速度快,社群活躍度高。但真正使得這門語言經久不衰的一個重要原因是它的無所不能,因為社群有各種各樣的第三庫,使得我們用Python實現一個東西實在是太簡單了,你經常會看到幾行程式碼實現爬蟲,10行程式碼實現人臉識別,雖然有些誇張,但確實就是有這樣的庫幫你把所有的繁文縟節全部封裝了,最後給你開放一個優雅的 API。


今天給你推薦的這個庫叫 “FuckIt.py”,名字一看就是很黃很暴力的那種,作者是這樣介紹它的:

FuckIt.py uses state-of-the-art technology to make sure your Python code runs whether it has any right to or not. Some code has an error? Fuck it.

FuckIt.py 使用了最先進的技術能夠使你的程式碼不管裡面有什麼樣的錯誤,你只管 FuckIt,程式就能“正常”執行,兵來將擋水來土掩。

640?wx_fmt=png


還是先來看個例子怎麼使用的吧。

安裝

pip install fuckit

假設有一個目標檔案: broke.py

def f():
    broken_code
    print('fuckit chaining works')

for

let's just assume this is a big module of shitty code.

x = y
y = x
1 / 0 # Oh shhhiiiiiii

var = "Are you proud of what you've done?"

broke.py 中有幾處明顯的錯誤,包括語法錯誤,變數 broken_code 沒有被定義,還有0當作被除數。

如果直接 import broke 肯定會報錯

>>> import broke
 File "broke.py", line 5
   for
     ^
SyntaxError: invalid syntax

這時你可以使用 fuckit 將 broke 匯入進來。

>>> import fuckit
>>> fuckit("broke")
<module 'broke' from 'broke.py'>
>>> broke
<module 'broke' from 'broke.py'>

呼叫函式 f 的時候也會報錯

>>> broke.f()
NameError: global name 'broken_code' is not defined

你可以使用鏈式 fuckit 來呼叫這個有問題的函式

>>> fuckit(broke).f()
fuckit chaining works

或者
>>> fuckit(fuckit("broke")).f()
fuckit chaining works

除此之外,fuckit 還可以作為裝飾器和上下文管理器來使用。

裝飾函式

>>> @fuckit
... def broken_function():
...    non_existant_variable # Let's create a NameError
...    return 'Function decorator works'
...
>>> print(broken_function())
None

裝飾類

>>> @fuckit
... class BrokenClass(object):
...    def f(self):
...        self.black_hole = 1 / 0
...        return 'Class decorator works'
...
>>> print(BrokenClass().f())
None

上下文管理器

>>> with fuckit:
...    print('Context manager works')
...    raise RuntimeError()
...

等價於

try:
    print('Context manager works')
except RuntimeError:
   pass

看到這裡,是不是感覺 fuckit 很暴力,那麼它能用在什麼場景?個人認為這個庫很雞肋,因為你的程式碼不應該容忍這些錯誤的出現,如果出現了錯誤應該立馬修復才是,但有一種可能的使用場景是你剛接手一份超複雜的程式碼,裡面各種看不懂的程式碼,而這些操蛋的程式碼時不時出現一個錯誤,而你又沒法駕馭它的時候,你就用 fuckit 吧。

fuckit的原始碼不到200行,好奇的你是不是很想知道它怎麼實現了,用了什麼黑科技?訪問專案地址: https://github.com/ajalt/fuckitpy

640?


推薦閱讀
Python:如何用一行程式碼獲取上個月是幾月

PS:昨天的推文【說兩個事情】有上次贈書活動的名單,中獎的朋友別忘了發寄件地址給我。

相關文章