2011-10-07 11 views
5

os.path.joinの機能がstrのサブクラスで機能しない理由は誰にも分かりますか?os.path.joinとstrサブクラス

:私は

class Path(str): 
    def __add__(self, other): 
     return Path(os.path.join(self, other)) 

p = Path(r'C:\the\path') 
d = p + 'some_file.txt' 

と私が望む結果を持っているコードだ

(私はWindows上でPython3.2のx64およびx86のPython2.7を使用していますし、結果は同じである)

'C:\\the\\path\\some_file.txt' 

ですが、出力はselfの値にかかわらず\\some_file.txtです。

私はどちらかstr(self)を行うかself.pathとして保存し、後で使用することができます知っているが、なぜos.join.pathがstrのサブクラスを受け入れず(あなたは数または任意の非文字列型を使用するときのように)エラーが発生していないのですか?

答えて

0

疑問がある場合は、ソース(Python32 \ Lib \ ntpath.py)をチェックしてください。関連ビット:

「」\「を挿入し、二つ以上のパス名の構成要素に参加 『『』(強調追加)

』必要に応じて 任意成分は、絶対パスである場合、以前のすべてのパスコンポーネントが破棄される。」 関数 joinの底部に向かって

は(bsome_file.txtある)path += '\\' + bを使用して、2つの片の間\を配置しようとしている - 第\を追加しsome_file.txt(プレーン文字列で)、次に呼び出すことによってPath(r'c:\the\path')にそれを追加Path.__add__(r'c:\the\path', r'\some_file.txt'),コールos.path.join ...

ファイル名の先頭に\がありますか?それがパスの最初の部分が失われている理由です。

os.path.joinstr(self)(またはself.path)と呼び出すのは、os.path.joinが2回ではなく1回だけ呼び出されるためです。

1

__add__メソッドでは、os.path.joinのビルドが使用されているようですが、これは__add__メソッドでprintステートメントを入れることで確認できます。

>>> class Path(str): 
...  def __add__(self, other): 
...    print 'add' 
...    return Path(os.path.join(str(self), other)) 
... 
>>> p = Path(r'/the/path') 
>>> p + 'thefile.txt' 
add 
>>> class Path(str): 
...  def __add__(self, other): 
...    print 'add' 
...    return Path(os.path.join(self, other)) 
... 
>>> p = Path(r'/the/path') 
>>> p + 'file.txt' 
add 
add 
# add printed twice 

最も簡単な解決策:

return Path(os.path.join(str(self), other)) 

へ 変更

return Path(os.path.join(self, other)) 

それは動作します。

+1

まあ、それは私がちょうど私の質問で書いたことです...私はそれがバグかCPythonの実装かどうかを知りたかったのです。 BTW 'isinstance'はこの場合はTrueを返します – JBernardo

+0

そうですね。 'string .__ class __.__ name__ == 'str'' –

+0

いいえ、私はいつでもそれを変更できるので、インタプリタはその文字列をチェックしませんでした。 – JBernardo

関連する問題