関数やメソッドを使って、変数に値を代入する方法はありますか?私はSchemeインタプリタを書いています。できれば、プロセスは大幅に簡素化されます。私はあなたが操作を行った結果され、ここで、クラス変数を使用することができます関数またはメソッドを使った代入
>>> operator.assign(a, 5)
>>> print(a)
5
関数やメソッドを使って、変数に値を代入する方法はありますか?私はSchemeインタプリタを書いています。できれば、プロセスは大幅に簡素化されます。私はあなたが操作を行った結果され、ここで、クラス変数を使用することができます関数またはメソッドを使った代入
>>> operator.assign(a, 5)
>>> print(a)
5
class Sample:
res = None
def Add(self, x, y):
self.res = x + y
obj = Sample()
obj.Add(2, 3)
print obj.res
何を意味するかの
>>> operator.add(2, 3)
5
例:これはそうのようなオペレータ・モジュールと基本的なロジックと数学のために行うことができますクラス変数resに格納されます。
私は値を割り当てる変数名を提供すると仮定しています。
サンプルコード:
import inspect
def assign(var_name, value):
inspect.stack()[1][0].f_locals[var_name] = value
try:
print("a={}".format(a))
except Exception as err:
print("ERROR: {}".format(err))
assign('a', 10)
try:
print("a={}".format(a))
except Exception as err:
print("ERROR: {}".format(err))
実行出力:
ERROR: name 'a' is not defined
a=10
を、これはお勧めしませんが、ここでそれを行うための方法だ - これは、呼び出し元のスコープ内の値を変更する伴います
ああ私。私はこれがOPの問題に対する最善の解決策ではないと大金を賭けるでしょう。 –
@JohnClements私は賭けていない:)私はあなたに同意するので。それはしかし、最も単純なものの一つです。 – Sharad
この機能の必要性は、プログラムデザインの再考が必要なヒントになる可能性があります。
詳細は入力しませんでしたが、名前の衝突を防ぐために別の名前空間が必要な場合があります。
たとえば、この方法で割り当て可能なすべての変数は、別のモジュールであっても何らかの種類のコンテナに格納することができます。 「トリック」は必要ありません。
これらの警告の後、ここに例があります。それは、現在のモジュール内の任意の名前を(再)assingすることができます。
import sys
this_module = sys.modules[__name__]
def assign(name, value):
setattr(this_module, name, value)
a = 1000
assign('b', a + 3)
print(b) # 1003
あなたは実際には、python名前空間とスキーム名前空間をマッシュしたくありません。 Python変数はインタプリタの実装の一部であり、スキーム変数は評価プログラムの一部です。あなたの仕事は、評価されたプログラムの環境をホスト言語の値を使って表現することです。辞書はおそらく良い選択だろう。しかし、あなたは実際にメインの定義を踏みにじるために 'main'という変数を定義するスキームプログラムがほしいと思っていますか?私はそうは思わない。
基本的な変数の割り当ては、 'x = operator.add(2,3)'のように動作しますが、あなたが意図したものではないと思います。予想される出力を持つコード行の例を提供できますか? – physicsGuy
Pythonはcall-by-referenceをサポートしていないので、 'assign'は実装できません。しかし、これがどのように単純化するのかは明らかではありません。例がありますか? – molbdnilo
基本的には、辞書の関数にリンクされたシンボルがたくさんあります。プログラムが '+'を読むと、それは辞書でそれを探し、2つの引数を与えます。変数定義の 'define'についても同じことをしたいと思います。 – ayNONE