当前位置: 首页 > 科技观察

Python开发指南:最佳实践精选

时间:2023-03-12 04:13:13 科技观察

总体原则价值“为您想要使用的其他人构建工具。”-KennethReitz“简洁总是胜过可用性。”-PieterHintjens“满足90%的使用场景。忽略那些拒绝的人。”——KennethReitz“美丽总比丑陋好。”-PEP20为开源开发(甚至是闭源项目)。一般开发指南“显式优于隐式”。-PEP20“易于阅读是有代价的。”-PEP20“任何人都可以打补丁。”-可汗学院开发文档错误的决定或低质量的编码),立即修复。“现在做总比不做好。”-PEP20“测试应该彻底。编写新功能文档。”人为驱动的开发比测试驱动的开发更重要。(译者:原文EvenmoreimportantthatTest-DrivenDevelopment--Human-DrivenDevelopment,译者认为moreimportantthatshouldbemoreimportantthan,应该是作者错别字了,否则意思不成立感觉,)这些指南可能——应该可能——会改变。当特定的指南样式感觉合理时,请遵循PEP8。命名变量、函数、方法、包、模块小写并使用下划线分隔单词(lower_case_with_underscores)类、异常大写(CapWords)受保护的方法和内部函数以单个下划线开头(_single_leading_underscore(self,...))private方法开始withadoubleunderscore(__double_leading_underscore(self,...))常量字母全部大写,单词用下划线分隔(ALL_CAPS_WITH_UNDERSCORES)一般命名准则尽量不要使用只有一个字母的变量名(例如,l,I,O,ETC。)。例外:在非常短的代码块中,如果变量名的含义从上下文中显而易见就可以了。元素中的e没有问题:e.mutate()避免重复变量名。正确的方式importaudiocore=audio.Core()controller=audio.Controller()错误的方式importaudiocore=audio.AudioCore()controller=audio.AudioController()“反向标记”更好。正确的方式elements=...elements_active=...elements_defunct=...错误的方式elements=...active_elements=...defunct_elements...避免使用getter和setter方法。正确的方式person.age=42错误的方式person.set_age(42)使用4个空格进行缩进——永远不要使用Tab制表符。就这样。模块引用指的是整个模块,而不是模块内的单个标识符。例如,假设在一个cantee模块下有一个sessions.py文件。正确的方法是importcanteenimportcanteen.sessionsfromcanteenimportsessions错误的方法是fromcanteenimportget_user#Symbolfromcanteen/__init__.pyfromcanteen.sessionsimportget_session#SymbolExceptionforfromcanteen/sessions.py:如果第三个的文档-方代码明确指出需要单一参考。原因:避免循环引用。看这里。将代码参考部分放在文件的顶部,按以下顺序分为三个部分,每个部分之间有一个空行。1.系统引用2.第三方引用3.本地引用原因:清晰展示各模块的引用来源。文档遵循??PEP257提出的文档字符串指南。reStructuredText(reST)和Sphinx有助于确保文档符合标准。对于明显的功能,写一个单行文档字符串。"""返回``foo``的路径名。"""多行文档字符串应包括:单行摘要,如果适用,描述使用场景参数返回的数据类型和语义信息,除非返回None"""训练a区分Foo和Bar的模型Usage::>>>importklassify>>>data=[("green","foo"),("orange","bar")]>>>classifier=klassify.train(data):paramtrain_data:形式为(color,label)的元组列表。:rtype:A:class:Classifier"""注意使用主要动词(“return”),而不是描述性词(“returnvalue”)。写在类的docstring中,用于__init__方法Documentation.classPerson(object):"""一个人的简单表示。:paramname:字符串,人名。:paramage:一个整数,人的年龄。"""def__init__(self,name,age):self.name=nameself.age=age尽量少用注释。与其写很多注释,不如提高代码的可读性。通常,简短方法比注释更有效。错误的方法#如果标志是停止标志ifsign.color=='red'andsign.sides==8:stop()correctwaydefis_stop_sign(sign):returnsign.color=='red'andsign.sides==8ifis_stop_sign(sign):stop()但当你写评论时,请记住:“按照斯托克和怀特所写的《风格的要素》。"-PEP8不要太担心每一行的长度。80到100个字符就可以了。使用括号来继续当前行。wiki=(“ColtPython是一把.357Magnum口径左轮手枪,以前由康涅狄格州哈特福德的Colt'sManufacturingCompany制造。它有时被称为“CombatMagnum”。它于1955年首次推出,'“与Smith&Wesson的M29.44Magnum同年。”)测试尝试测试所有代码,但不必沉迷于覆盖范围。一般测试指南使用长的、描述性的名称。通常,这避免了重新记录测试方法。测试应该相互隔离。不要与真实的数据库或网络交互。使用可以在测试后销毁的单独测试数据库,或使用模拟对象。使用工厂模式而不是夹具。不要通过不完整的测试,否则你有忘记的风险。您应该添加一些占位符语句,例如assertFalse,"TODO:finishme"。单元测试一次只关注一个小的功能点。运行速度很快,但慢总比没有测试好。一般来说,每个类或模型都应该有一个测试用例类。导入单元测试导入工厂类PersonTest(unittest.TestCase):defsetUp(self):self.person=factories.PersonFactory()deftest_has_age_in_dog_years(self):self.assertEqual(self.person.dog_years,self.person.age/7)功能测试功能测试是更高级别的测试,更接近最终用户如何与应用程序交互的级别。通常用于网络应用和图形应用测试。根据场景编写测试。测试用例的测试方法命名应该看起来像场景描述。在写代码之前,通过注释说明具体的场景信息。importunittestclassTestAUser(unittest.TestCase):deftest_can_write_a_blog_post(self):#转到她的仪表板...#点击“新帖子”...#填写帖子表格...#点击“提交”...#可以看到新帖子...注意,测试用例的类名是和测试方法名放在一起的,类似于“测试用户是否可以发博文”。本文的灵感来自...PEP20(Python之禅)PEP8(Python风格指南)TheHitchiker'sGuidetoPythonKhanAcademyDevelopmentDocsPythonBestPracticePatternsPythonicSensibilitiesThePragmaticProgrammer等等