1

コンテキスト: オブジェクトを別のオブジェクトに置き換えたい:

x = []
r = [2]
replace(x, r)
assert x == [2]
assert x is r

Smalltalk では、これは と呼ばれbecomeます。

質問: どうすればいいですか? C拡張を作成する必要がありますか、それともすでにこのようなものがありますか?

私は試しました: これしかし、私は非常に多くのケースを処理する必要があります。ポインターの背後にあるオブジェクトを変更するだけで十分です。

理由:機能、改良、サブジェクトなどの拡張機能を実装したい。組み込みオブジェクトのクラスを変更してos.__class__ = X柔軟性を高めることができない場合があります。それができないので、交換を考えました。

具体的な使用例:

主観的な見方:

import pylung
pylung.deutsch()

import os # I want to preserve object identity with the original os

os.ERREICHE_SETZEN
os.durchlaufe(...)

翻訳:

import os
import pylung

os = pylung.translate(os, 'deutsch') # German

@os.walk
def durchlaufe(ordner, oben_nach_unten, folge_links):
    """Ordner baum erzeuger
"""
4

4 に答える 4

4

シンプル=はあなたが望むことをします:

x = []
r = [2]
x = r
assert x == [2]
assert x == r
assert x is r
于 2013-05-31T13:21:35.300 に答える
3

これができるようになりたい場合は...

import pylung
pylung.deutsch()

import os # I want to preserve object identity with the original os

os.ERREICHE_SETZEN
os.durchlaufe(...)

os...そして既存のライブラリ (英語名を使用します) との互換性を維持します。モジュールに属性を置き換えるよりも、属性を追加する方がおそらく最も簡単です。例えば...

# pylung.py
def deutsch():
    import os
    os.durchlaufe = os.walk
    # etc...

...モジュール名も翻訳したい場合は、次のようcollectionskollektionenすることができます...

# pylung.py
import sys

def deutsch():
    import os
    os.durchlaufe = os.walk
    # etc...
    import collections
    sys.modules['kollektionen'] = sys.modules['collections']

...繰り返しますが、互換性のために元のモジュール名をそのままにしておいてください。

また、カスタム インポート フックを使用してオンデマンドでモジュールの変換を行うことも検討できるため、スクリプトで実際に使用されているシンボルのみを置き換える必要があります。

于 2013-05-31T13:56:06.790 に答える
2

Python では、これをネイティブに行う唯一の方法は代入を使用することです。

x = []
r = [2]
x = r
assert x == [2]
assert x is r

ただし、これは非常に些細なことであり、あなたが探しているものであるとは思えません。多くの場合、すべての参照をr更新する必要があります。これは Python では不可能です。スライスの割り当てを使用して、ファッションの後にそれを行うことができますが、これは実際にはオブジェクトのアイデンティティを変更しないため、最後のものassertは失敗し、これはリストなどの特定のタイプでのみ機能します (ただし、他のいくつかのコンテナタイプには同様の機能があります) ; たとえば、 adictを使用する.clear().update())。

x = []
r = [2]
x[:] = r
assert x == [2]
assert x is r     # fails

おそらく、最も近いのは、リストを属性として保持するラッパー オブジェクトを使用することです。ラッパーが常に渡され、リストは渡されず、常にラッパーを介してリストにアクセスする場合は、属性を更新するだけで、他のすべての参照でそれが表示されます。

編集:上記を書いた後に追加した特定のユースケースを見ると、実際には何も置き換える必要はありません。翻訳された関数/クラス名を既存のモジュール オブジェクトに設定するだけです (必要に応じて、既存のものを削除します)。もっと簡単な方法は、おそらくまったく新しいモジュールを作成し、それを に貼り付けることsys.modules[modulename]です。他のモジュールがインポートする前にこれを行う限り、翻訳されていないモジュールが表示されることはありません。

もちろん、これは愚かなことです。Python コードを別の人間の言語に機械翻訳する良い方法はありません。手で翻訳し、独自のインポート可能なモジュールとして関係者に提供します。

于 2013-05-31T13:23:01.117 に答える
1

変数は、実際には、スコープを表す辞書で検索される名前にすぎないことに注意してください。

スコープ (辞書) には、実際には参照 (考える、ポインター) が含まれています。ポインターを置き換えることはできますが、Python ではオブジェクトをその場で変更する方法がありません。これは、C の参照を使用して実行できることです (基になるメモリ セルにアクセスできます) が、オブジェクトのサイズが一致しなければならないという制限があります。いいえ、できません。

于 2013-05-31T13:23:40.033 に答える