Передача функции-члена как функции 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")
принты "фу"