2

ドキュメントでは、Python でデータ コンテナーを動的に作成する次のメカニズムが提案されています。

class Employee:
    pass

john = Employee() # Create an empty employee record

# Fill the fields of the record
john.name = 'John Doe'
john.dept = 'computer lab'
john.salary = 1000

上記により、辞書のようにjohn引用符 ( ) を入力することなく、1 つの識別子 ( ) 内でさまざまな変数のセットを簡単にグループ化できます。''

断片 (属性) を現在の名前空間に「ダンプ」できるソリューションを探しています。これに対処するために頭に浮かぶ3つのアイデア/問題があります。

1.上記の識別子が与えられた場合、そのjohn属性のリストをプログラムで取得するにはどうすればよいですか?

2.dump john現在の名前空間で の属性を簡単に取得するにはどうすればよいですか? (つまり、浅いコピーまたは深いコピーのいずれかを介してnamedept、というローカル変数を作成します)salary

3.次のスレッドの一番上の回答は、Python で作成された名前空間から変数をダンプする方法を説明していますargparse: Importing variables from a namespace object in Python

おそらくNamespace、上記の投稿のように、オブジェクトをデータ コンテナーとして使用し、それらの変数を次のように簡単にダンプできます。

locals().update(vars(john))

?

便宜上、Python でデータ コンテナを作成するための他のアプローチについて議論しているスレッドのリストを以下に示します。そのうちのいくつかは選択できないようです。

MATLAB ワークフローとの接続:

save参考までに、MATLAB はとを介してこの正確な機能を提供しload、変数は簡単にネストおよびネスト解除できるため、この目的で引用符/辞書を使用する必要がなくなります)。この質問の背後にある動機は、Python でそのような「選択可能なワークスペース」をサポートするメカニズムを特定することです。

4

1 に答える 1

2
  • john の上の識別子が与えられた場合、その属性のリストをプログラムで取得するにはどうすればよいですか?

    vars(john)

技術的には、これにより辞書マッピングが得られます。属性のリストのみが必要な場合は、実際に必要になりますvars(john).keys()

  • 現在の名前空間で john の属性を簡単にダンプするにはどうすればよいですか? (つまり、name、dept、salary という名前のローカル変数を、浅いコピーまたは深いコピーを介して作成します)

浅いコピーまたは深いコピーについて、ここで何を意味するのかわかりません。単純な参照について話している場合、これを行う(良い)方法はありません。グローバル (モジュール レベル) 名前空間にいる場合は、次のことができます。

globals().update(vars(john))

CPython を使用している場合、 usinglocals().update(vars(john))は (いくつかの場所で) 機能しますが、ドキュメントではこれを行うことに対して明示的に警告しています。あなたができる最善のことは、ある種のexecループです(うん!):

d = vars(john)
for k in john:
    exec '{key} = d["{key}"]'.format(key=k)

このコードが醜いのには十分な理由があることに注意してください -- 主に -- このようなことをするべきではありません :-P

を使用する場合execは、通常の警告が適用されます - の属性を信頼していることを確認してくださいjohn。たとえばsetattr(john,'__import__("os").remove("useful_file"); foo',"anything here")、かなり悪い日になります...

于 2013-02-05T21:12:50.997 に答える