如果Python的生成器用HaXe来表达.

imcj 发布于 2012/10/25 13:18
阅读 749
收藏 0

如果Python的生成器用HaXe来表达.

格式稍微好点的地方 http://my.oschina.net/u/250735/blog/85033

gunicorn的ChunkedReader类,作用是从当TransferEncoding: Chunked的时候用该类来分析读取Body。

通过生成器从Buffer中读取字符,生成器用在这个地方既方便又清晰明了。看了这段代码,让我也对Python生成器的应用场景又多了些认识。

我现在尝试用HaXe语言来翻译这个软件,通过迭代器进行模拟,因为会增加一个类,而且状态被转移到了类的字段上,再加上我的设计有些问题,所以这样的设计没有Python看起来优美,简洁。因为我希望别人看这段代码的时候无障碍,提高易读性,所以特来求助。

期望

  • 你可以为我提供设计思路,点出迭代器在这个场景引用的缺点。或者我代码的缺陷。
  • 如果你想为我提供代码解惑,可以fork我这个库然后pull & request给我。

URLS

  • https://github.com/shitou/gunicorn/blob/master/gunicorn/http/body.py
  • https://github.com/shitou/hxgunicorn/blob/master/src/http/body/ChunkedReader.hx
  • https://github.com/shitou/hxgunicorn/blob/master/src/http/body/ChunkedReaderIterator.hx

以上是相关代码地址:

01 pass
02  
03 <!-- lang: python -->
04 class ChunkedReader(object):
05 def __init__(self, req, unreader):
06     self.req = req
07     self.parser = self.parse_chunked(unreader)
08     self.buf = StringIO()
09  
10 def read(self, size):
11     if self.parser:
12         while self.buf.tell() < size:
13             try:
14                 self.buf.write(self.parser.next())
15             except StopIteration:
16                 self.parser = None
17                 break
18  
19 def parse_chunked(self, unreader):
20     (size, rest) = self.parse_chunk_size(unreader)
21     while size > 0:
22         while size > len(rest):
23             size -= len(rest)
24             yield rest
25             rest = unreader.read()
26             if not rest:
27                 raise NoMoreData()
28         yield rest[:size]
29         # Remove \r\n after chunk
30         rest = rest[size:]
31         while len(rest) < 2:
32             rest += unreader.read()
33         if rest[:2] != '\r\n':
34             raise ChunkMissingTerminator(rest[:2])
35         (size, rest) = self.parse_chunk_size(unreader, data=rest[2:])
36  
37  
38 <!-- lang: as3 -->
39 class ChunkedReader {
40 var parser : ChunkedReaderIterator ( );
41  
42 public function new ( )
43 {
44     parser  = ChunkedReaderIterator ( );
45 }
46  
47 function read ( ? size : Int ) : String
48 {
49  
50     if ( parser ) {
51         while ( this.buffer.position < size ) {
52             this.buffer.write ( chunkReaderIterator.next ( ) );
53         }
54     }
55 }
56  
57 <!-- lang: as3 -->
58 class ChunkedReaderIterator
59 {
60 public function next ( ) : String
61 {
62     var chunks : Array<Dynamic>;
63     if ( null == size ) {
64         chunks = parseChunkSize ( );
65         size = chunks[0];
66         rest = chunks[1];
67     } else
68         parseChunkSize ( rest );
69  
70     var ret = rest.substring ( 0, size );
71     rest = rest.substr ( size );
72  
73     if ( rest.length < 2 )
74         rest += unreader.read ( );
75  
76     if ( "\r\n" != rest.substr ( 0, 2 ) )
77         throw new ChunkMissingTerminator ( rest.substr ( 0, 2 ) );
78  
79     return ret;
80 }
81  
82 function parseChunkSize ( ?data : String = null ) : Array<Dynamic>
83 {
84 }

加载中
返回顶部
顶部