寫flowpy的動機其實和scala有點關係

大家可以看看scala,是門好語言。數據結構真~棒。

python 是可以有這個的。

於是呢,我之前就想搞些好用的數據結構,主要是提供舒服的寫法。

之前我給這個東西取名叫freestyle.py,實現之後發覺太蠢了,於是我把它刪了。

實現在這裡,代碼很短。

github.com/thautwarm/St

然後兩個demo文件

github.com/thautwarm/St

github.com/thautwarm/St

我覺得還算舒服,看題圖就大概知道是什麼的了(當然題圖有點擠,可能導致非常不好的印象,嗎?。。

這個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如何安裝?

TAG:Python | 编程范式 |