1. 程式人生 > >Python黑科技:FuckIt.py

Python黑科技:FuckIt.py

說起 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,程式就能“正常”執行,兵來將擋水來土掩。

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

安裝

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