2016-05-13 8 views
2

はのは、私は/にはいくつかのメソッドをオーバーライドする実装strから派生したカスタムクラスがあるとしましょう:Pythonでカスタム文字列リテラルプレフィックスを作ることは可能ですか?

class mystr(str): 
    # just an example for a custom method: 
    def something(self): 
     return "anything" 

は、今現在、私は手動でそれをコンストラクタに文字列を渡すことでmystrのインスタンスを作成する必要があります。

ms1 = mystr("my string") 

s = "another string" 
ms2 = mystr(s) 

これはそれほど悪いことではありませんが、b'bytes string'またはr'raw string'またはu'unicode string'に似たカスタム文字列プレフィックスを使用することは賢明であるという考えにつながります。

それはmystrの新しいインスタンスでリテラルm'my string'結果となるようmのようなカスタム文字列リテラルの接頭辞を登録/作成するために、Pythonで何とか可能ですか?
これらのプレフィックスはPythonインタプリタにハードコードされていますか?

+0

残念ながら、いいえ、インタプリタを変更したり、自分でコンパイルしたりすることはありません。興味深いことに、これは[ECMAScriptが将来行うことができる](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_template_literals)です。 –

答えて

7

これらのプレフィックスはインタープリタでハードコードされているため、より多くのプレフィックスを登録することはできません。


でしが行うが、カスタムソースのコーデックを使用することによって、あなたのPythonのファイルを前処理です。これは、あなたがカスタムコーデックを登録し、ソースコード変換を理解して適用する必要がある、きちんとしたハックです。

Pythonはあなたが一番上に特殊なコメントでソースコードのエンコーディングを指定することができます:ソースコードがUTF-8でエンコードされていることのPythonを言うだろう、と解析の前にそれに応じてファイルをデコードします

# coding: utf-8 

。 Pythonはcodecsモジュールレジストリでこれのコーデックを検索します。 あなた自身のコーデックを登録することができます

pyxl projectはこのトリックを使ってPythonファイルのHTML構文を解析し、実際のP​​ython構文に置き換えてそのHTMLをビルドします。そのプロジェクトのcodec packageを参照してください。register moduleにはcustom codec search functionが登録されています。これは、Pythonが実際に解析してコンパイルする前にソースコードを変換します。 custom .pth fileは、site-packagesディレクトリにインストールされ、この登録手順をPythonの起動時にロードします。 Rubyスタイルの文字列フォーマットを解析するために同じことを行う別のプロジェクトはinterpyです。

それでは、コーデックを作成してPythonソースファイルを構文解析して(おそらくtokenize moduleでトークン化して)、文字列リテラルをカスタムプレフィックスの代わりにmystr(<string literal>)呼び出しに置き換えます。あなたが解析したいファイルは# coding: yourcustomcodecとなります。

私はその部分を読者の練習問題として残します。がんばろう!

この変換の結果は、キャッシュされたバイトコードにコンパイルされます。あなたの変換は、を一度だけソースコードリビジョンあたりで実行する必要があります。コーデックを使用するモジュールの他のすべてのインポートでは、キャッシュされたバイトコードがロードされます。

+0

うわー、私はそれが良いディアであるかどうかはわかりませんが、ハッキング要因は素晴らしいです –

+0

ねえ、それはクールなアプローチです。もちろん、プロダクションコードでは必要なものは何もありませんが、確かに興味深いものです。私は単に 'mystr(" my string ")を書くのがずっと簡単だと恐れています;;)それに固執します。ありがとう! –

+0

@ByteCommander:まあ、私はDropboxがプロダクションで 'pyxl'コーデックを使用していると確信しています。コーデックを登録するのはかなり軽量であり、復号化トークン化変換ステップはコンパイル時に*行わなければなりません。結果はバイトコードにコンパイルされ、キャッシュされます。この手順は、ソースコードが変更されるまで繰り返されず、バイトコードキャッシュは無効になります。 –

関連する問題