Python: Могу ли я иметь строку в качестве ключа и функцию в качестве значения в словаре? - PullRequest
1 голос
/ 03 октября 2011

Другими словами, это дает мне ошибки только потому, что на самом деле это невозможно, или я просто пишу неправильно:

class someClass:

    self.myString = "Hello"
    self.myMap =  {
    'someString' : self.functionInClass
    }

Так что, если functionInClass принимает аргумент, я хочу вызвать его такиз любого места внутри класса:

self.myMap[self.myString](theArgument)

Это просто дает:

NameError: name 'self' is not defined

Любая помощь будет оценена.

Ответы [ 5 ]

3 голосов
/ 03 октября 2011

Да, вы можете сделать это, так как методы (или связанные методы) - это просто сами объекты.

В вашем коде вы забыли свою функцию.Я думаю, что вы хотели написать что-то вроде этого:

class someClass:
    def __init__(self):
        self.myString = "Hello"
        self.myMap =  {
            'someString' : self.functionInClass
        }

    def functionInClass(self):
        pass
1 голос
/ 03 октября 2011

Это совершенно верно.

>>> def f():
...     print "test"
...
>>> d = {'df':f}
>>> d['df']()
test
>>>

Этот тестовый код не использует класс, но то же самое можно сделать и с классом.Ошибка показывает, что self не определено, это не имеет ничего общего с функциями в словаре.

0 голосов
/ 03 октября 2011

Если вы хотите, чтобы myMap был атрибутом класса, задайте для dict значения string-name для методов и используйте getattr , чтобы получить фактический метод:

class SomeClass(object):
    myMap =  {
        'someString' : 'methodInClass'
        }
    def methodInClass(self,argument):
        pass

x = SomeClass()
getattr(x,x.myMap['someString'])('argument')
0 голосов
/ 03 октября 2011

Ваш код должен работать.Возможно, вы просто что-то забыли.Это хорошо работает для меня:

class someClass:

    def __init__(self):
        self.myString = "someString"
        self.myMap =  {
            'someString' : self.functionInClass
        }   

    def functionInClass(self, argument):
        print argument

    def someMethod(self):
        self.myMap[self.myString]("argument")

cl = someClass()

cl.someMethod()
cl.myMap[cl.myString]("argument")
0 голосов
/ 03 октября 2011

Нет ничего невозможного в том, что вы пытаетесь сделать:

class Test(object):

  def func1(self, arg):
    print 'func1, arg=%s' % arg

  def func2(self, arg, **kwargs):
    print 'func2, arg=%s, kwargs=%s' % (arg, kwargs)

  funcmap = {'func1': func1, 'func2': func2}

  def invoke(self, fname, *args, **kwargs):
    Test.funcmap[fname](self, *args, **kwargs)

test = Test()
test.invoke('func1', 0)
test.invoke('func2', 42, kw=12)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...