Pythonize Me:如何在Python中管理调用方上下文变量?(Python/Django)

2024-04-26 14:38:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Django中重构一个相当大的view函数。有太多的变量浮动,这是一个巨大的函数。在

理想情况下,我希望将视图模块化为逻辑函数。 但是,我必须传递函数上下文以方便访问变量。在

例如:

def complex_view(request, slug):
    some complex logic which creates variable abc ...
    ...
    some more complex logic which uses variable abc ...
    ...
    etc.

应该变成:

^{pr2}$

我可以想出一些方法来做到这一点,其中一些在本页中已经指出: http://mail.python.org/pipermail/tutor/2009-February/067506.html

a.主视图中定义的子功能。因为很难区分哪些变量是共享的,哪些是不共享的,所以这看起来很混乱

b.locals()作为字典传入。这也是一个混乱,因为现在有两种不同的访问变量的方法:xyz和{}。你必须在堆栈上的call N中使用一个,在调用N+1中使用下一个。在

c.强力将所有变量传递给每个函数调用并返回相关变量。当涉及到很多变量时,这会变得非常乏味。在

<强> D.<强> C++中,我只需创建一个类^ {< CD6>},定义所有共享变量,并创建成员函数来执行该工作。然后您可以对该类中的所有内容使用self.xyz。 我想我也可以在Python中使用这个方法。但不确定这是不是最好的方法。在

在Python/Django中,您对首选的方法有什么看法?在


Tags: django方法函数viewwhich定义情况some
2条回答

我喜欢(d)-为它创建一个类,并使用成员函数来完成这项工作。在

在Django中,视图只是一个“callable”,它接受HTTPRequest对象,以及URL路由传递给它的任何其他参数。在

Python类可以像函数一样被调用,如果您在Python类上定义一个__call__方法,如下所示:

class MyView(object):
    def __call__(self, request, slug)
        # do stuff here

    def helper_method(self):
        # etc.

然后您可以在urls.py文件中命名该类,它将像任何其他python函数一样被调用。在

执行此操作还可以将类似视图转换为对象实例:

^{pr2}$

在网址.py,引用对象(而不是类)对象也可以像函数一样调用。在

其他技巧是使用继承来定义相似的视图,或者为基类中的许多类似视图提供一些通用功能,然后专门的视图类从这些视图类继承。在

您可以查看this slideshow by Simon Willison以获取更多详细信息,或查看{a2}以获取具体示例

我可以建议使用类似于d)的东西吗

class ComplexView_SharedVariables:
  # Shared variables (to be used as instance variables, not class variables!)
  a = "somevalue"
  b = ...
  c = ...

class ComplexView_Methods1:
  ... some functionality ...

class ComplexView_Methods2:
  ... some more functionality ...

class ComplexView_All(ComplexView_SharedVariables, ComplexView_Methods1, ComplexView_Methods2):
  # This class puts together all functionality and shared variables
  pass

通过这个过程,您甚至可以将类拆分为不同的文件(如果Django可以这样做,我没有经验)。在

相关问题 更多 >