お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2012-06-16 15:55:03

sirase
メンバ
From: 福岡県
登録日: 2012-06-02

add-apt-repository Pythonスクリプトについて

少しこの「開発環境」フォーラムで取り扱う趣旨とは異なるかもしれないのですが
他に適当なフォーラムが見当たらなかったので、素朴な疑問を投稿致します。

今日何気なくnautilusで /usr/bin/ の下を眺めていたところ
add-apt-repository がバイナリではなく ASCIIファイルのアイコンになっていました。
興味を持ったのでgeditで開いてみたら、その実体はPythonスクリプトでした。

私にはどうせ読んでも分からないだろうとは思いましたが、一応上から眺めていって
気になった点が1点あります。

コード:

def utf8(s):
    """
    Takes a string or unicode object and returns a utf-8 encoded
    string, errors are ignored
    """
    if s is None:
        return None
    if isinstance(s, unicode):
        return s.encode("utf-8", "ignore")
    return unicode(s, "utf8", "ignore").encode("utf8")

という関数についてですが、全く同じ関数が2個ありませんか?
16行目から始まる utf8(s) 関数と
50行目から始まる utf8(s) 関数が、全く同じに見えます。
149行目でこの関数は

コード:

print " %s" % utf8(ppa_info["description"] or "")

として呼び出されているのですが、この場合全く同じ関数名で2つ定義してあると
どっちが呼ばれるんでしょうね?(中身が全く同一だからどっちが呼ばれても同じ挙動
しそうですが・・・)。
後から読まれた関数名で、ファイルの上の方に定義されてある関数が上書きされる感じですかね?
クラスの中のメソッドとして同じメソッド名で、シグニチャが異なるならオーバーロードか〜とか
思うのですが、クラスでもないただの関数でシグニチャも全く同じな為、どうなるのかなと・・・。

にしても、そもそもどうして全く同じ関数が2つあるのでしょうか?不思議です。
些細な疑問ですが、もしご存じの方ご教示頂けますと幸いです。

以上、よろしくお願い致します。

オフライン

 

#2 2012-06-16 21:06:33

vbk
メンバ
From: Lake Hamana in Hamamatsu
登録日: 2009-12-22

Re: add-apt-repository Pythonスクリプトについて

確かに全く同じ関数が宣言されていますね。

どっちが呼ばれるんでしょうね?(中身が全く同一だからどっちが呼ばれても同じ挙動
しそうですが・・・)。
後から読まれた関数名で、ファイルの上の方に定義されてある関数が上書きされる感じですかね?

重複した名前の関数が宣言されている場合、呼び出しの時点で最も最後に宣言されていた関数が実行されます。
この場合は50行目の関数が呼び出されるはずです。

バグ報告しておきました。
https://bugs.launchpad.net/ubuntu/+source/software-properties/+bug/1014038

オフライン

 

#3 2012-06-16 21:54:28

sirase
メンバ
From: 福岡県
登録日: 2012-06-02

Re: add-apt-repository Pythonスクリプトについて

なるほど、バグでしたか。

バグ報告ありがとうございます。
疑問が解決してすっきりしました。

オフライン

 

Board footer

Powered by FluxBB