[英]how to proceed function().function()?
我正在尋找這樣的功能:
select().orderBy()
其中,首先調用select()
select().orderBy()
,然后調用orderBy()
。
為此,我將一個方法定義為select方法,如下所示:
def select(self):
if self.key is not None:
self.request = """SELECT """ + self.key[0] + """ FROM """ + self.table
else:
self.request = """SELECT * FROM """ + self.table
def where():
self.request += """ WHERE """ + self.key[0] + """ = """ + self.value[0]
return self.request
def orderBy(key, value):
self.request += """ ORDER BY """ + key + """ """ + value
return self.request
def groupBy(arg):
self.request += """ GROUP BY """ + arg
return self.request
def limit(arg):
self.request += """ LIMIT """ + arg
return self.request
但是我有這個錯誤信息:
AttributeError: 'NoneType' object has no attribute 'orderBy'
有人知道該怎么做嗎?
鏈接方法(流暢的或生成的API)僅在前一個調用返回支持下一個方法的對象時才有效; 在foo().bar()
, foo()
必須返回具有.bar()
方法的對象。 您的.select()
方法返回None
,該對象不支持任何其他方法。
您的select
函數應該返回self
:
return self
使通話可鏈接。 您可能還希望其他調用也返回self
,而不是self.request
。 我在這里假設其他方法確實是同一類上的方法(您的示例缺少每個方法的self
參數)。
如果你想擁有這些方法只能是因為你嵌套他們里面select()
方法,則不會在所有的工作。 這些函數對象只是函數主體中未使用的本地名稱,在返回的對象上不可用。
如果這些方法不應存在於定義select
的同一類上,請定義一個新類,並讓該類實現您的額外方法。 讓select()
返回該類的實例:
class Selectable:
# ...
def select(self):
column = '*' if new_clone.key is None else new_clone.key
request = """SELECT {} FROM {}""".format(column, new_clone.table)
return Query(request)
class Query:
def __init__(self, request):
self.request = request
def where(self):
self.request += """ WHERE """ + self.key[0] + """ = """ + self.value[0]
return self
def orderBy(self, key, value):
self.request += """ ORDER BY """ + key + """ """ + value
return self
def groupBy(self, arg):
self.request += """ GROUP BY """ + arg
return self
def limit(self, arg):
self.request += """ LIMIT """ + arg
return self
請注意, Query()
上的每個方法都返回self
因此您可以繼續進行鏈接。
但是,您隨后將操縱同一實例,並且將無法從通用基礎創建單獨的查詢對象。 SQLAlchemy可以做得更好。 它返回self
的克隆 ,並帶有以下更改:
def _clone(self):
return type(self)(self.request)
def where(self):
new_clone = self._clone()
new_clone.request += """ WHERE {} = {}""".format(self.key[0], self.value[0])
return new_clone
現在, base = Selectable().select()
和filtered = base.where()
使filtered
成為一個不同的克隆,因此您可以繼續使用base
來構建其他查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.