Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 风格指南:如何避免在大项目中陷入混乱_Python_Django_Module - Fatal编程技术网

Python 风格指南:如何避免在大项目中陷入混乱

Python 风格指南:如何避免在大项目中陷入混乱,python,django,module,Python,Django,Module,Django==2.2.5 在下面的示例中,有两个自定义过滤器和两个辅助函数。 这是一个假的例子,不是一个真正的代码 此代码有两个问题: 当一个项目变得很大时,我忘记了我已经编写的aux函数。更不用说团队编程了。这里的解决方案是什么?为可导入的功能组织单独的模块?按字母顺序排序 这里的一些函数可以在这个包之外重用,而有些函数则不能。比如说,combine函数似乎是可重用的,而get\u salted\u str肯定只适用于此模块。我认为最好是区分可能导入的功能和可能不导入的功能。使用下划线符号标

Django==2.2.5

在下面的示例中,有两个自定义过滤器和两个辅助函数。 这是一个假的例子,不是一个真正的代码

此代码有两个问题:

  • 当一个项目变得很大时,我忘记了我已经编写的aux函数。更不用说团队编程了。这里的解决方案是什么?为可导入的功能组织单独的模块?按字母顺序排序

  • 这里的一些函数可以在这个包之外重用,而有些函数则不能。比如说,combine函数似乎是可重用的,而
    get\u salted\u str
    肯定只适用于此模块。我认为最好是区分可能导入的功能和可能不导入的功能。使用下划线符号标记未修改的函数是否更好?像这样:
    \u吃盐\u吃str
    。这可能会稍微缓解第一个问题

  • Django风格指南或任何其他pythonic风格指南是否提到了上述两个问题的解决方案

  • 我的代码示例:

    def combine(str1, str2):
        return "{}_{}".format(str1, str2)
    
    def get_salted_str(str):
        SALT = "slkdjghslkdjfghsldfghaaasd"
        return combine(str, SALT)
    
    @register.filter
    def get_salted_string(str):    
        return combine(str, get_salted_str(str))
    
    
    @register.filter
    def get_salted_peppered_string(str):
        salted_str = get_salted_str(str)
        PEPPER = "1234128712908369735619346"
    
        return "{}_{}".format(PEPPER, salted_str)
    
  • 当一个项目变得很大时,我忘记了我已经编写的aux函数。更不用说团队编程了。这里的解决方案是什么
  • 良好的文档和适当的模块化

    为可导入的功能组织单独的模块

    从技术上讲,所有函数(当然嵌套函数除外)都可以导入。现在,我假设您的意思是:“对于要从其他模块导入的函数”,但即使如此,这也没有多大意义-通常情况下,主要用于“内部使用”(在同一模块中使用的辅助函数)的函数稍后会对其他模块有用

    此外,重新组合函数的正确方法不是基于这些函数是供内部使用还是供公共使用(这是通过在“仅供内部使用”函数前加一个前导下划线来处理的),而是基于这些函数之间的关系

    注:我使用“函数”一词是因为你的问题就是这样表述的,但这适用于所有其他名称(类等)

    按字母顺序排序

    坏主意IMHO-从函数POV看它没有任何意义,并且在合并分支时可能会导致问题

  • 这里的一些函数可以在这个包之外重用,而有些函数则不能。比如说,combine函数似乎是可重用的,而“get_salted_str”肯定只适用于这个模块。我认为最好是区分可能导入的功能和可能不导入的功能。使用下划线符号标记未修改的函数是否更好?像这样:_get_salt_str。这可能会稍微缓解第一个问题 实际上,为什么要阻止另一个模块导入
    get_salted_str

    “protected”(单前导下划线)名称用于模块的客户端代码不应该弄乱甚至不应该知道的实现部分,这称为“封装”,其目的是允许在不破坏客户端代码的情况下进行实现更改

    在您的示例中,
    get\u salted\u str()
    是一个模板过滤器,因此它显然是包的公共API的一部分

    另外,
    combine
    看起来确实像是一个实现细节——另一个包中一些不相关的代码可能需要使用相同的分隔符组合两个字符串这一事实似乎是偶然的,如果将
    combine
    作为模块API的一部分公开,则无论如何都无法更改其实现。从您的示例中我可以看出,这是一个典型的实现函数(而且它非常琐碎,我认为它不值得作为ar公开)

    作为一个更一般的层面:虽然避免重复是一个非常可听的目标,但你必须小心做得过火。有些复制实际上是“偶然的”——在某个时间点,代码中两个完全不相关的部分有几行相同,但原因完全不同,可能导致代码中一个点发生更改的力与另一个部分完全不相关。因此,在分解看似重复的代码之前,问问自己,这段代码是否出于同样的原因在做同样的事情,以及在一部分中更改这段代码是否也会影响到另一部分

  • Django风格指南或任何其他pythonic风格指南是否提到了上述两个问题的解决方案
  • 这不是Django特有的,甚至不是Python特有的。无论使用何种语言,编写组织良好的代码都依赖于相同的启发式方法:您需要高内聚性(同一模块中的所有函数/类等都应该相关,并为相同的问题提供解决方案)和低耦合性(模块应尽可能少地依赖其他模块)

    注意:我在这里说的是“模块”,但对于包(包是一种超级模块)或类(类也是一种小型模块-除了可以有多个实例之外)也有相同的规则


    现在必须说,适当的模块化——如适当的命名等——是很难做到的。它需要时间和经验(以及大量的反思)来培养(不是双关语,而是…)对它的“感觉”,即使这样,你也经常发现自己在项目的生命周期中会重新组织很多事情。而且,几乎总会有一些混乱的地方,因为有时发现一个给定的特性真正属于哪里有点胡乱猜测(提示:寻找名为“util”或“utils”或“helpers”的模块或包-这些通常是开发人员重新组合不明确属于其他任何地方的东西的地方).

    有很多方法可以做到这一点,所以我总是这样处理:

    1。项目中的可重用功能

    首先也是最重要的:文件。在大团队中工作时,您肯定需要记录可重用功能。 第二,包装。当创造大量的