寫flowpy的動機其實和scala有點關係
大家可以看看scala,是門好語言。數據結構真~棒。
python 是可以有這個的。
於是呢,我之前就想搞些好用的數據結構,主要是提供舒服的寫法。
之前我給這個東西取名叫freestyle.py,實現之後發覺太蠢了,於是我把它刪了。
實現在這裡,代碼很短。
https://github.com/thautwarm/Stardust/blob/master/freestyle/collections.py
然後兩個demo文件
https://github.com/thautwarm/Stardust/blob/master/freestyle/test_for_custom_colsure.py
https://github.com/thautwarm/Stardust/blob/master/freestyle/test_for_global_var.py
我覺得還算舒服,看題圖就大概知道是什麼的了(當然題圖有點擠,可能導致非常不好的印象,嗎?。。
這個collections.py里的richIterator類啊,它無論是map還是filter還是groupBy還是connectedWith(這個東西其實就模仿模式匹配...),返回的都是生成器,也就是惰性的,方便你做compose,性能也有保證。
最後我發現這個最後其實並不是很好用的。
比如現在有一個let方法了。
container.let(v=5).map(lambda x:x+v, this)n
let可以把字典傳參弄進去的變數傳入一個指定的閉包。這個閉包在這裡指定。
from freestyle.collections import globals_manager,blocknglobals_manager(globals()) # let 方法綁定到全局變數中n# mc = block() #my closuren# globals_manager((mc)) #let 方法綁定到mc閉包中nncontainer.let(v=1).then(lambda x: f(v)) #如果綁定到全局n# container.let(v=1).then(lambda x: f(mc.v)) #如果綁定到mcn
如果綁定到全局變數,在container做完一個流程的動作後,會釋放綁定的變數,把原先的同名全局變數(如果有)放回來。
實現很簡單,可以看我碼源。
還有一個this,
container.let()後, this就作為container本身進入了指定的閉包,待做完一個動作流程,將原先指定的閉包中的this綁定回來。
this就是前面的表達式,為什麼需要一個this呢?
f: (container, container)->containernf(container1,container2).let().xxxn
就是這個用途。
以上看起來還將就,但是問題很大。
原生Python里沒有連接表達式和語句的辦法。我的解決措施是引入lisp。
def lisp(*targs, **kwargs):n argNums = len(targs)n if not argNums:n return Nonen elif argNums is 1:n value, = targsn return valuen else:n f, *ttargs = targsn ttargs = map(lambda x: lisp(x), ttargs)n kw = dict(map(lambda x: (x, lisp(kwargs[x])), kwargs))n return f(*ttargs, **kw)n
但是寫起來太蠢了,因為不能放棄tuple類型,導致本身又臭又長的lisp括弧前面都還需要加一個lisp。
container.then(add, this, this) #把兩個容器拼起來ncontainer.then(map, lambda x:(lisp(SET, v, x+1)), this) # 你賦值了,但是沒什麼用,而且很醜n
總之,原生python來做這些真的不好用。
我之前還想過這樣。
container.define(param.x[int].y[float].define(param.x+ param.y)) # 在表達式里定義函數n
醜陋不說,還需要用那醜陋的元編程,那__getattrbute__和__getitem__等等。。
所以原生python你不得不在寫代碼時寫著寫著又回到前面加幾句,卻不是為了重構。真是不流暢。
而我想要流暢。
然後我ddl來了,得死命碼幾天。
之後把flowpy帶pip和conda的預編譯版本放出來好了,讓大家看看什麼叫完全兼容.jpg。
推薦閱讀:
※如何从拉勾网往里面来看互联网企业里面的数据挖掘现状如何?
※如何用Yacc實現一個Python的編譯器?
※Python pygame如何安裝?