0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Polyphony にまつわる 25 の話題Advent Calendar 2017

Day 10

もっとライブラリを!import を使う

Last updated at Posted at 2017-12-09

Python には import という便利な機能がある。これを使えばファイルを分割して管理できる。ちょっとしたライブラリが書けるというわけだ。

まずは簡単なところで定数をライブラリ化しよう。

asicc_const.py
SOH = 0x01
STX = 0x02
EOT = 0x04
ACK = 0x06
DLE = 0x10
NAK = 0x15
CAN = 0x18

これは、次の記事で使う予定の xmodem が使うアスキーコード。必要なところだけを書いている。(おって、全部に対応する予定)

使う側は python と同じ方法で import 出来る。

from ascii_const import EOT, ACK, NAK, CAN

class や関数も同様に import 出来る。次の記述は x_mem という class と定数を import した例である。

from xmodem_mem import x_mem, CMD_NOP, CMD_WRITE, CMD_READ, BLOCK_SIZE

@module
class xmodem_m2q:
    def __init__(self):
        self.xmodem_in_q  = Queue(bit8, 'in',  maxsize=128)
        self.xmodem_out_q = Queue(bit8, 'out',  maxsize=128)
        self.mem = x_mem()

        self.idouk  = Queue(bit8, 'out')
        self.append_worker(self.worker)

...
後略
...

これはかなり強力だ。class から動的にオブジェクトを生成するとることは出来ないが、init からであれば、それは静的に配置される。x_mem のコンストラクタを見てみよう。

@module
class x_mem:
    def __init__(self, max_block_n = 8):
        self.max_block_n = max_block_n

        self.bin_in_q = Queue(bit8, 'in', maxsize=128)
        self.bin_out_q = Queue(bit8, 'out', maxsize=128)

        self.cmd = Queue(bit2, 'in')
        self.cmd_busy = Port(bit, 'out', init=0)
        self.append_worker(self.worker)
...
後略
...

こちらでは Queue として bin_in_q や bin_out_q、cmd が生成されている。これらは外部と通信する口なので、外からアクセス可能である。つまり、自分のモジュールに x_mem を取り入れて、この Queue を使って通信することが可能なのだ。

この方式を使うとライブラリを使いまわすことが出来、一気に汎用性が増す。将来的に Polyphony が取り入れるであろう関数オブジェクトの機能が加わると、より汎用性は増す。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?