对get(self)和post(self)运行相同代码
在其他回答中提到过,对于任何请求,def get(self)
和 def post(self)
这两个函数可以运行相同的代码。我在想大家通常会用什么方法来实现这一点。我想到了一些方法:
class ListSubs(webapp.RequestHandler):
def get(self):
self._run()
def post(self):
self._run()
def _run(self):
self.response.out.write("This works nicely!")
4 个回答
我用过这个:
class ListSubs(webapp.RequestHandler):
def post(self):
self.response.out.write("This works nicely!")
def get(self):
self.post()
把负责具体工作的代码整理到一个单独的函数或方法里,这是正确的做法。
我想给你讲讲为什么你现在用的方法(把重复的代码提取到一个单独的方法中,然后在post和get方法中调用它)比简单地让其中一个方法调用另一个方法要好。
从理论上讲,“方法A完全依赖于方法B”意味着一种“主次关系”或者“不对称”——这是一种设计决策,意味着将来对B的任何修改都会自动影响到A;而A可能会在未来稍微根据B进行一些定制(在A调用B之前或之后加一些额外的代码),但反过来就不行了。当没有理由去期待这种主次关系时,把这种想法写进代码里其实是个坏主意。通过让A和B都调用共同的私有方法C,你就避免了这种不对称。
有些人可能不太喜欢理论上的说法,更倾向于实际的理由:幸运的是,在这种情况下,理论和实际是直接相关的。再次强调,这是关于代码未来演变的问题:让A和B都调用C,给了你足够的灵活性,可以对A和B进行小的定制(在调用C之前或之后加代码),无论是对A、B,还是两者都不加。因为你不知道将来需要哪些灵活性,而这种灵活性对简单性的影响几乎可以忽略不计,所以选择简单又灵活的方法是非常实际和明智的。
还有一个实际的观点(适用于任何选择):每当你遇到类似这样的模式:
def amethod(self):
return cmethod(self)
通常来说,把它改写成
amethod = cmethod
会更好。这可以避免不必要的调用嵌套(扁平化比嵌套更好)。所以,你的类可以这样编写:
class ListSubs(webapp.RequestHandler):
def _run(self):
self.response.out.write("This works even better!")
get = post = _run
没什么大不了的,如果将来你确实需要在嵌套调用之前或之后进行一些调整(比如从get
到_run
等),或者在调试时需要其他调整(例如在post
上设置一个断点,但不让它在get
上触发等),你可能需要再改回原来的“嵌套”方式,但在可行的情况下,这样的小简化是很有用的。