Передача функции-члена как функции arg?

Я написал очень простую функцию выбора для SQLite, но я не понимаю, как передать функцию-член... например: .fetchone(), .fetchmany(),

def select(cursor, select="*", table="reuters", fetch=".fetchone()", tologfile=False, logfile=""):
    if tologfile:
        logfile = open(logfile, 'w')
        logfile.write(str(cursor.execute("select * from ?;".replace('?',table).replace("select * ", "select "+select)).fetchone()))
        logfile.close()
    else: return str(cursor.execute("select * from ?;".replace('?',table).replace("select * ", "select "+select)).fetchone())

Как передать эту функцию-член в качестве аргумента?

4 ответа

Решение

Хорошо, получил это на работу:

import sqlite3

def select(self, attr="*", table="reuters", fetch=None, num=None, tologfile=False, logfile=""):
    if fetch is None:
        fetch=self.fetchone
    output=self.execute("select * from ?;".replace('?',table).replace("select * ", ("select "+attr+' ')))

    output=fetch(num) if num else fetch()

    if tologfile:
        logfile = open(logfile, 'w')
        logfile.write(str(output))
        logfile.close()
    else: return output

if __name__ == '__main__':    
    connection = sqlite3.connect('winkwinknudgenudgesaynomore.db')
    cursor = connection.cursor()
    cursor.execute("drop table reuters;")
    cursor.execute("create table reuters (foo text, bar text);")
    connection.commit()
    print select(cursor)
    print select(cursor, 'bar')
    print select(cursor, 'bar', fetch=cursor.fetchmany, num=5)
    cursor.close()

Вы можете просто пройти self.fetchone чтобы передать эту функцию.

Если вы хотите использовать его как значение по умолчанию, просто используйте None в определении функции и добавить

if whatever is None:
    whatever = self.fetchone

в самой функции.

Если вы хотите вызвать метод для другого объекта, но self продолжайте передавать его как строку и используйте этот код (на основе вашего else код, так как тот короче):

result = self.execute("select * from ?;".replace('?',table).replace("select * ", ("select "+attr)))
return str(getattr(result, whatever)())

Вы можете использовать getattr:

>>> class A:
...     def b(self):
...             print 'c'
... 
>>> a = A()
>>> getattr(a,'b')
<bound method A.b of <__main__.A instance at 0x7f2a24a85170>>
>>> getattr(a,'b')()
c

Лямбда может достичь этого

class A:
  def test(self):
    print "hello world"

a = A()
func = (lambda: a.test())
func()

принты "привет мир"

Эта техника также может быть расширена для обработки и преобразования аргументов.

class B:
  def test(self, x):
    print x

b = B()
func = (lambda a, b : b.test(b))
func("garbage", "foo")

принты "фу"

Другие вопросы по тегам