Python
Perl

別ファイルの関数を使用する方法Perl版とPython版

More than 1 year has passed since last update.

注意:頭に_の付く関数やメソッドはプライベートなものなので外部からアクセスするのは本来よろしくない。(Pycharmは警告を出してくれる)

Perl版

Foo.pm
package Foo;
use v5.10;
use strict;
use warnings;
use Exporter 'import';

our @EXPORT_OK = qw/pub_func/; # pub_func関数をエクスポートできるようにする

sub pub_func {
    say "pub_func";
}

sub _pri_func {
    say "_pri_func";
}
1;
main.pl
#!/usr/bin/perl
use v5.10;
use strict;
use warnings;

use FindBin qw($Bin);
use lib "$Bin";
use Foo qw/pub_func/; # pub_func関数を名前空間にインポートする

sub main {
    pub_func();       # pub_func
    Foo::pub_func();  # pub_func
    Foo::_pri_func(); # _pri_func
}

if ($0 eq __FILE__) {
    main();
}

Python版

foo.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, division, absolute_import


def pub_func():
    print("pub_func")


def _pri_func():
    print("_pri_func")

main.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function, division, absolute_import

import foo
from foo import pub_func  # pub_func関数を名前空間にインポートする


def main():
    pub_func()      # pub_func
    foo.pub_func()  # pub_func
    foo._pri_func() # _pri_func
                    # Pycharmだと頭に_が付く関数は"Access to a protected member _pri_func of a module"の警告を出してくれる


if __name__ == '__main__':
    main()

from モジュール import 名前1, 名前2の書き方については
以下の通り、複数の同じ関数名を名前空間にインポートしてしまう可能性があるので推奨していない。

Python 良い慣用句、悪い慣用句

今回のは、これまでの「ダメ」よりかなり弱い「ダメ」ですが、やはりそれなりの理由がなければ、やめておいたほうが良いことに変わりありません。これが大抵うまくないのは、いつの間にか二つ別々の名前空間に住む一つのオブジェクトを持つことになるからです

名前空間に直接インポートしない改良版

main2.pl
#!/usr/bin/perl
use v5.10;
use strict;
use warnings;

use FindBin qw($Bin);
use lib "$Bin";
#use Foo qw/pub_func/;
use Foo;

sub pub_func {
    return Foo::pub_func(@_);
}

sub main {
    pub_func();       # pub_func
    Foo::pub_func();  # pub_func
    Foo::_pri_func(); # _pri_func
}

if ($0 eq __FILE__) {
    main();
}

こうすれば引数と返り値は丸投げできるので、関数名は自由に変えられる。
Python版は引数全部を丸投げする方法がわからなかったので省略。(全部きちんと書かないといけないのかしら)