2012-01-25 27 views
2

インポートして呼び出したときにタプルをチェックして変更する関数を作成しようとしています。私はこれを複数回呼び出すことができるようにしたいと思います。しかし、変数を変更する方法を見つけることができないので、関数に新しい変数を返すようにするだけです。しかし、今、私はこれをしなければならないインポートされた関数によるPythonの変更変更

**modifier.py** 
import variable 

def function(new_string): 
    if new_string not in variable.tuple: 
     variable.tuple = new_string, + variable.tuple 

**variable.py** 
import modifier 

tuple = ('one','two',) 

modifier.function('add this') 

modifier.function('now this') 

#--> tuple should now equal ('now this', 'add this', 'one', 'two',) 

**modifier.py**  
def function(tuple_old, new_string): 
    if new_string not in tuple_old: 
     return new_string, + tuple_old 

**variable.py** 
import modifier 

tuple = ('one','two',) 

tuple = modifier.function(tuple, 'add this') 

tuple = modifier.function(tuple, 'now this') 

#--> tuple now equals ('now this', 'add this', 'one', 'two',) 

これは、多くのメシエある

は、ここで私はそれが動作したい方法を2つのファイルと私の例です。まず、タプルを直接置き換えるのではなく、古いタプルの値を渡して戻り値を取得する必要があります。それは動作しますが、DRYではなく、私はこのクリーナーを作る方法がなければならないことを知っています。


これは実際には私のミドルウェアを私のdjango設定ファイルで更新するためのものなので、リストを使うことはできません。また、私はに別のファイルに関数を持たせることを持っていないが、私はそれが可能でなければならないと考えている。

+0

最初のブロックのコードを試しましたか? –

+0

タプルを変更することはできません。 – wim

+0

あなたは循環インポートを持っています – wim

答えて

2

私はあなたが今やっていることについて何か問題(最後のコードブロックを)見ない、それは明らかです。私のようなものが表示される場合:

tuple = # something ... 

を私は(おそらくそれはあなたが例えば使用だけの名前ですが、「タプル」あなたの変数を呼び出すことはありません)というタプルが変更される知っています。

しかし、私は(あなたがしたいのですがどのような)これを見れば:私はfunctiontupleのthaの値を変更することを想像したことはありませんでした

tuple = 'one', two' 
function('add this') 

。とにかく、それがで行うことができます。

tuple = 'one', 'two' 

def function(string): 
    global tuple 
    if new_string not in tuple: 
     tuple = (new_string,) + tuple 

function('add this') 

また、このような何かを行うことができます。

tuple = 'one', two' 
function(tuple, 'add this') 

私はそれが少し良くだと言うだろう、私はあなたのコード持っprobelmsを使用した場合、私は可能性があるため、 functionはタプルする何かを行います。

、コードは次のようになります。私はあなたが今やっていることは明確で、よりシンプルであることを言うだろう終わり

tuple = 'one', 'two' 

def function(old_tuple, string): 
    global tuple 
    if new_string not in old_tuple: 
     tuple = (new_string,) + old_tuple 

function(tuple, 'add this') 

、私はそれを変更しません。

+0

あなたが持っている最後のコードブロックは私が望むものですが、関数がタプルと関数の呼び出しとは別のファイルにあることも欲しいと思います。あなたが持っていることをすると、関数内のファイル内のタプルが変更されますが、タプルファイルから呼び出されたときに、タプル付きファイル内で関数を呼び出した後は編集済みのバージョンは保持されません。 –

+0

実際、私はあなたが正しいと思っています。もっと明確に。私はまだ他の方法が可能な場合でも興味があります。 –

+1

@ saul.shanabrook:あなたが実際にグローバルなものをパラメータとして渡す必要がある場合を除き、はい、もっと明確です。好奇心のために、2つのファイルを使って何をしようとしていたのでしょうか?サイクリックインポートで終了したため、エラーが発生しました。 –

1

これは動作するようです:

def function(new_string): 
if new_string not in variable.tuple: 
    variable.tuple = (new_string,) + variable.tuple 
+0

同じファイル内にあれば動作します。彼らがそうでないなら、それはしません。 [その他の回答](http://stackoverflow.com/a/9000442/907060)はそれをうまく説明しています。 –

関連する問題