注意:頭に_
の付く関数やメソッドはプライベートなものなので外部からアクセスするのは本来よろしくない。(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
の書き方については
以下の通り、複数の同じ関数名を名前空間にインポートしてしまう可能性があるので推奨していない。
今回のは、これまでの「ダメ」よりかなり弱い「ダメ」ですが、やはりそれなりの理由がなければ、やめておいたほうが良いことに変わりありません。これが大抵うまくないのは、いつの間にか二つ別々の名前空間に住む一つのオブジェクトを持つことになるからです
名前空間に直接インポートしない改良版
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版は引数全部を丸投げする方法がわからなかったので省略。(全部きちんと書かないといけないのかしら)