見出し画像

Mojo入門 (3) - MojoモジュールとMojoパッケージ

以下の記事が面白かったので、かるくまとめました。

Mojo modules and packages

前回


1. Mojoモジュール

「Mojoモジュール」は、「Mojoコード」にインポートして利用する「Mojoコード」です。

「Mojoモジュール」の記述例は、次のとおりです。このコードには main() がないため、mymodule.mojo を直接実行することはできません。

・mymodule.mojo

struct MyPair:
    var first: Int
    var second: Int

    fn __init__(inout self, first: Int, second: Int):
        self.first = first
        self.second = second

    fn dump(self):
        print(self.first, self.second)


「Mojoモジュール」を使用する「Mojoコード」の記述例は、次のとおりです。

・main.mojo

from mymodule import MyPair

fn main():
    let mine = MyPair(2, 4)
    mine.dump()


モジュール全体をインポートして、モジュール名を介してアクセスすることもできます。

・main.mojo

import mymodule

fn main():
    let mine = mymodule.MyPair(2, 4)
    mine.dump()


「as」を使用してインポートされたメンバーの別名を使用することもできます。

・main.mojo

import mymodule as my

fn main():
    let mine = my.MyPair(2, 4)
    mine.dump()


mymodule.mojo と main.mojo が同じディレクトリにある場合にのみ機能します。現在、「mojoコード」が他のディレクトリに存在する場合、モジュールとしてインポートすることはできません。

2. Mojoパッケージ

Mojoパッケージ」は、1つのディレクトリでまとめた「Mojoモジュール」群です。全モジュールをまとめ、てまたは個別にインポートできます。「.mojopkg」または「.📦」にコンパイルして共有しやすくすることもできます。

プロジェクトのファイル構成を以下とします。

・main.mojo
・mypackage/
    ・__init__.mojo
(空ファイル)
    ・mymodule.mojo
(上記コードと同じ)


「main.mojo」は、次のように「MyPair」をインポートできます。「__init__.mojo」がないと、ディレクトリがパッケージとして認識されません。

・main.mojo

from mypackage.mymodule import MyPair

fn main():
    let mine = my.MyPair(2, 4)
    mine.dump()


パッケージをコンパイルするコマンドは、次のとおりです。パッケージファイル「mypack.mojopkg」が生成されます。

$ mojo package mypackage -o mypack.mojopkg


パッケージファイルのみ (ディレクトリなしに) でパッケージを利用できます。

・main.mojo
・mypack.mojopkg

・main.mojo

from mypack.mymodule import MyPair

3. __init__.mojo

ディレクトリを「Mojoパッケージ」として認識するには、「__init__.mojo」が必要です。空ファイルにすることもできます。

プロジェクトのファイル構成を以下とします。

・main.mojo
・mypackage/
    ・__init__.mojo
(空ファイル)
    ・mymodule.mojo
(上記コードと同じ)

次の行を「__init__.mojo」に追加します。

・__init__.mojo

from .mymodule import MyPair


これで、main.mojo の importを次のように簡略化できます。

・main.mojo

from mypackage import MyPair


この機能は、Mojo 標準ライブラリの一部のメンバーがパッケージ名からインポートできる一方で、他のメンバーが <package_name>.<module_name> 表記を必要とする理由を説明します。たとえば、関数モジュールはアルゴリズムパッケージ内に存在するため、次のようにそのモジュールのメンバー (map() など) をインポートできます。

from algorithm.functional import map

「algorithm/__init__.mojo」には次の行も含まれています。

・algorithm/__init__.mojo

from .functional import *
from .reduction import *

したがって、パッケージ名を付けるだけで、関数型またはリダクション型のものをインポートできます。 つまり、import ステートメントから関数名を削除することもできます。

from algorithm import map



この記事が気に入ったらサポートをしてみませんか?