为了方便原型设计,我依赖于在整个代码中大量使用的许多全局变量。但是现在我想将其中一些设置为本地(但动态)。在本地class IndexAjaxView(View):
def get(self, request):
param = request.GET.get('param')
if param == 'get_total_topup':
return self.get_total_topup(request) # <--- just change this
return JSONResponse({}, status=404)
def get_total_topup(self, request):
return JSONResponse({
'value': 'Rp.{:,.0f},-'.format(
TopUp.objects.filter(owned_by=request.user).aggregate(Sum('amount'))['amount__sum']
)
})
而不是在全局special
声明它们是否有任何重大弊端(例如效率等)?
答案 0 :(得分:1)
特殊变量不受欢迎的功能包括:
这使得从功能上对代码进行推理变得更加困难。这意味着您的函数在语法上等效的调用会产生不同的结果。
如果在代码的某个位置(例如,在系统函数中)定义了词法变量,则将其覆盖并导致错误。
特殊(动态)绑定不受欢迎,会使不熟悉它的读者感到困惑。
只需使用词法绑定,或者甚至使用照应宏。
更多信息:
隐喻宏请参阅Doug Hoyte的Let Over Lambda或Paul Graham的隐喻宏。
LiSP(小片段Lisp)中有一节有关绑定和动态绑定
Elisp默认情况下具有动态绑定,并且长时间执行强制动态绑定
许多早期的lisps具有动态绑定功能,但已将其删除。