2016-06-23 5 views
2

私はPythonには新しく、値を関数として持つ辞書を作成しようとしていました。ここに私のコード辞書キーの値のペアでパラメータを持つ関数を渡す方法

import os 

class Foo(): 
    def print1(self,n): 
     print 5 


    def print2(self,n): 
     print 6 

    def foo(self): 
     bar = {'a': self.print1, 'b': self.print2} 
     bar['b'](5) 
     bar['a'](3) 
     bar[os.environ['FOO']]() 


f = Foo() 
f.foo() 

Traceback (most recent call last): 
    File "test_dict.py", line 17, in <module> 
    f.foo() 
    File "test_dict.py", line 13, in foo 
    bar[b]() 

python test_dict.py 
6 
5 
    Traceback (most recent call last): 
     File "test_dict.py", line 19, in <module> 
     f.foo() 
     File "test_dict.py", line 15, in foo 
     bar[os.environ['FOO']]() 
    TypeError: print2() takes exactly 2 arguments (1 given) 
+0

あなたの関数は何も返していません。したがって、 'bar [b]'は 'None'です。したがって、 'NoneType not callable'というエラーが発生しました。 – SvbZ3r0

+1

呼び出し可能を辞書の値として入れることはできません。しかし、この場合は、関数*の出力を辞書に入れます。 – jonrsharpe

+0

'' 'os.environ ['FOO']' ''は何を評価するのですか? – wwii

答えて

0

を使用することができ、次のいずれか

class Foo(): 
    def print1(self,n): 
     print 6 

    def print2(self,n): 
     print n 

    def foo(self): 
     bar = {'a': self.print1, 'b': self.print2 } 
     bar['b'](5) 
     bar['a'](3) 

f = Foo() 
f.foo() 

それはあなたが望むものを行います。

+0

上記のコメントはまだ私にエラーを与えています。ここでコードである: 'インポートOS Fooクラスは、(): DEF PRINT1(自己): プリント5 DEF PRINT2(自己): プリント6 デフFOO(自己): バー= {' a ':self.print1、' b ':self.print2} bar [' b '](5) bar [' a '](3) bar [os.environ [' FOO ']]() f.foo() ' – user3034987

+0

ここにはエラーがあります:トレースバック(最新の最後の呼び出し): ファイル "test_dict.py"、ライン19、 f.foo() ファイルfooの "test_dict.py"、行13、 bar ['b'](5) TypeError:print2()は引数1をとります(2が指定されています) – user3034987

+0

@ user3034987その正確なコードが動作します私のために。実行しようとしている正確なコードを含めるように質問を更新する必要があります。 – DeepSpace

-1

は、あなたがそれを行う方法であり、関数が呼び出されると、関数のような呼び出し可能にしたい場合は、結果は、(あなたは何も返さないので、Noneですもの)格納されます、あなたはその周りlambdaを書いたり、このコードを試してみてくださいfunctools.partial

+0

かっこなしで名前を渡すだけで何が問題になりますか? –

+0

何もない、それは彼が望んでいたかもしれないということは私には起こりませんでした。コードは、部分的な目的であるパラメータを修正したいかのように見えます。その後、bar [b](5)の代わりにbar [b]()として呼び出すことができます。 – phogl

+0

あなたは正しいです...引数を指定して関数を渡したかったようです。それは参照のみでは不可能です。しかし、この背後にある感覚は非常に疑わしいです... ^^ –

1

bar = {'a': self.print1(6), 'b': self.print2(5) }は、関数を辞書の値として格納しません。

関数print1print2を呼び出し、その戻り値を格納します。両方の関数がprintのみで、何も返さないので、{'a': None, 'b': None }という辞書が得られ、その理由はNoneTypeの例外です。

代わりに、あなたが行う必要があります。

bar = {'a': self.print1, 'b': self.print2 }

その後:

bar['b'](5) 
>> 5 
+0

同様に試しましたが、うまくいきませんでした。上記の私のコメントを参照してください。 – user3034987

+0

@ user3034987その正確なコードは私のために働く。実行しようとしている正確なコードを含めるように質問を更新する必要があります。 – DeepSpace

+0

は、私が実行している正確なコードと出力を取得しているコードを更新しました。私はこのケースではBとしてFOOを設定しています – user3034987

関連する問題