Python编码规范详解:3步走,统一团队代码风格,提升开发效率!

发布时间: 2024-12-07 01:06:31 阅读量: 12 订阅数: 13
ZIP

Python开发编码规范

![Python编码规范详解:3步走,统一团队代码风格,提升开发效率!](https://www.simplilearn.com/ice9/free_resources_article_thumb/commentsinPythonexp.png) # 1. Python编码规范概述 Python编码规范是指导Python编程实践的一系列规则和指南,旨在提升代码的可读性和一致性。随着Python在全球范围内的普及,其规范性变得更加重要,不仅能够帮助开发者避免常见错误,还能提高开发效率和维护性。在这一章节,我们将从宏观角度审视编码规范的重要性,理解它在开发过程中的作用,并为深入学习编码风格和实践打下坚实的基础。 良好的编码规范能为团队协作提供标准,降低交流成本,确保团队成员之间的代码易于理解和协作开发。此外,随着Python语言自身版本的不断更新,编码规范也在适应新的语法特性和编程范式,保持与语言发展的同步。本章将为读者描绘Python编码规范的全貌,并指出遵循规范的长远好处。在接下来的章节中,我们将深入了解具体的编码风格、工具使用以及最佳实践。 # 2. ``` # 第二章:编码风格基础 ## 2.1 Python代码布局 ### 2.1.1 缩进、空格和换行 在Python编程中,缩进是定义代码块层级结构的主要方式。Python解释器并不使用花括号 `{}` 来区分代码块,而是依靠缩进量。正确的缩进能够提高代码的可读性,而错误的缩进则会导致 `IndentationError`。一般推荐使用4个空格来代表一个缩进层级,并且在整段代码中保持一致的缩进风格。 ```python def my_function(): print("Hello, Python!") print("This is an indented code block.") ``` 在上面的示例中,两个 `print` 语句都比函数定义的首行缩进4个空格,从而表达出它们是函数的一部分。换行是另一个与代码布局相关的概念。适当的换行可以让代码块的逻辑更加清晰,尤其是当处理长的表达式或参数列表时。 Python中对于换行的处理也非常灵活。例如,长的列表或字典可以直接放在多行中,使用方括号或花括号的闭合来表示该结构继续。 ```python long_list = [ 1, 2, 3, 4, 5, 6, ] long_dict = { 'key1': 'value1', 'key2': 'value2', } ``` ### 2.1.2 行宽限制与续行 为了保持代码的整洁与可读性,Python社区普遍接受的代码行宽限制是80个字符。这意味着每一行代码都应该限制在这个宽度内,以避免阅读时需要左右移动视线。如果一行代码超过了这个宽度,应该通过续行的方式进行分割。有多种方式来实现代码的续行,包括但不限于使用圆括号 `()`、方括号 `[]`、花括号 `{}` 以及反斜杠 `\`。 ```python # 使用圆括号进行续行 result = (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10) # 使用方括号进行续行 my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 使用花括号进行续行 my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4} # 使用反斜杠进行续行 if (1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10): print("The sum is", result) ``` ## 2.2 命名约定 ### 2.2.1 变量、函数和类的命名 Python中变量、函数、类的命名要遵循特定的约定以提高代码的可读性和一致性。变量名通常使用小写字母和下划线进行分隔(小写字母命名法),例如 `user_name`、`current_temperature`。函数名也遵循小写字母命名法,但是为了和变量名区分开来,通常使用动词作为函数名的开始,例如 `get_user_info()`、`calculate_sum()`。 类的命名则需要首字母大写,并且使用驼峰命名法(每个单词的首字母大写),如 `ClassName`、`UserAccount`。这些命名约定有助于区分不同类型的对象,同时使得代码更加清晰易懂。 ### 2.2.2 模块和包的命名 模块是包含Python代码的文件,而包是包含多个模块的文件夹。模块和包的命名应该简洁明了,使用小写字母,并且避免使用特殊字符。包名中如果有多个单词,推荐使用下划线来连接,如 `module_name`、`package_name`。模块的命名也遵循相似的规则。 ```plaintext # 文件结构示例 package_name/ __init__.py module_name1.py module_name2.py ``` 这里,`package_name` 是包的名称,而 `module_name1.py` 和 `module_name2.py` 是包内模块的名称。 ## 2.3 注释与文档 ### 2.3.1 注释的规则和风格 注释是用来说明代码功能、意图以及逻辑的文本,它们对理解代码至关重要。Python中注释是使用 `#` 开头的文本,它后面的内容会被解释器忽略。良好的注释应当简洁明了,对复杂的逻辑进行解释,而不是描述代码正在做什么。 ```python # 计算数字的阶乘 def factorial(n): result = 1 for i in range(1, n + 1): result *= i return result ``` 在这个例子中,注释提供了 `factorial` 函数功能的简洁描述,而不是简单地重复代码中的行为。 ### 2.3.2 文档字符串的标准写法 Python中推荐使用文档字符串(docstrings)来编写函数、类、模块的文档。文档字符串位于对象定义的最外层,并且被三引号 `"""` 包围。文档字符串的第一个部分应该是一个摘要描述,紧跟着是可选的详细说明,最后是关于参数、返回值、异常以及其它重要信息的详细描述。 ```python def greet(name): """ Give a greeting to the person passed in as a parameter. :param name: str, name of the person to greet :return: str, the greeting message """ return "Hello, " + name + "!" ``` 这里的文档字符串使用了Google风格的格式,提供了函数的功能描述、参数说明以及返回值说明,这对于代码的使用者来说非常有帮助。 ``` # 3. 编码规范实践 ## 3.1 PEP 8风格指南 ### 3.1.1 PEP 8概述及其重要性 PEP 8是Python Enhancement Proposal 8的缩写,它是指导Python代码风格的官方文档。PEP 8不仅定义了代码的格式规范,如空格的使用、行宽限制等,还包括了一些关于如何编写清晰易读代码的建议。其重要性体现在以下几个方面: - **可读性**:统一的代码风格有助于提高代码的可读性,使其他开发者更容易理解和维护代码。 - **团队协作**:当团队成员遵循同一套规则时,可以减少不必要的沟通成本,提升协作效率。 - **标准化**:PEP 8作为Python社区的共识,标准化了Python代码的外观,从而使得Python代码更容易被社区接受和使用。 ### 3.1.2 遵循PEP 8的最佳实践 为了更好地遵循PEP 8风格指南,开发者应当留意以下几个关键点: - **缩进**:使用4个空格进行缩进,而不是使用制表符(Tab)。 - **空格**:在操作符两侧各添加一个空格,但在逗号、冒号后面添加空格,前面则不加。 - **行宽**:建议每行不超过79个字符,以保证代码在不同设备上的易读性。 - **导入**:导入应当放在文件的顶部,在模块注释和文档字符串之后,在全局变量之前。 - **命名约定**:使用小写字母和下划线(snake_case)来命名变量和函数,类名使用驼峰命名法(CapWords)。 ```python # 正确的缩进和空格使用示例 for i in range(10): # 注释:循环体中应遵循缩进规则 print(i) # 正确的空格使用,在操作符和逗号之间 # 正确的命名示例 user_name = "Alice" user_scores = {"math": 90, "science": 95} class UserClass: pass ``` ## 3.2 编码工具与IDE集成 ### 3.2.1 使用flake8、black等工具进行代码检查 flake8和black是Python开发者常用的代码检查和格式化工具,它们可以帮助开发者自动发现并修正代码中的风格问题。flake8会检查PEP 8指南的违背情况,black则是一个强力的代码格式化器,它可以快速将代码格式化为符合PEP 8的风格。 - **flake8**:通过扫描代码,查找不遵循PEP 8的样式问题。 - **black**:自动格式化代码,无需任何配置,且格式化结果是一致的。 ### 3.2.2 IDE的自动格式化和代码风格统一 集成开发环境(IDE)通常提供了代码风格统一的插件和功能,使得编码规范的实践更为便捷。大多数现代IDE如PyCharm、VSCode等,都支持与flake8、black等工具的集成,并可以配置为在保存文件时自动运行这些工具。 - **PyCharm**:内置了代码检查和格式化的功能,能够根据PEP 8自动提示和修正代码。 - **VSCode**:通过安装Python和Pylance插件,可以实现代码的实时PEP 8风格检查和自动格式化。 ## 3.3 代码复审与持续集成 ### 3.3.1 代码审查中的编码规范检查 代码审查是确保代码质量的关键环节,编码规范的检查应当成为代码审查的必检项之一。在审查过程中,审查者需要特别注意以下几点: - **代码布局**:检查代码是否使用了正确的缩进和空格。 - **命名约定**:确保所有的变量、函数、类和模块的命名都遵循了PEP 8的约定。 - **注释和文档**:确认注释的准确性和文档字符串的完整性。 ### 3.3.2 在持续集成中强制编码规范 持续集成(CI)是现代软件开发流程中不可或缺的一环。在CI流程中强制执行编码规范,可以确保项目代码库的整洁和一致性。实现这一目标的常见方式包括: - **集成flake8**:在CI流程中加入flake8检查步骤,确保提交到代码库的代码符合PEP 8风格。 - **使用pre-commit钩子**:在代码提交之前自动运行black或flake8,防止不符合规范的代码提交到主分支。 通过这些实践,团队可以确保即使在频繁的代码提交中,代码库也能持续保持高质量的编码标准。 # 4. 进阶编码技巧 ## 4.1 设计模式在编码规范中的应用 ### 设计模式简介 设计模式是软件工程中用于解决特定问题的可复用解决方案。它们是经验丰富的开发人员集体智慧的结晶,目的是为了应对软件开发中反复出现的设计问题。设计模式的使用有助于提高代码的可读性、可维护性,并简化复杂系统的开发。最经典的分类包括创建型、结构型和行为型三大类模式,每个类别都包含一系列具体的设计模式。 在编码规范中应用设计模式不仅要求开发者理解这些模式的结构和意图,还要求他们在实际代码中恰当地使用。这通常意味着代码的编写要更加规范化和标准化,以适应模式的模板和结构。 ### 设计模式与编码规范的结合 结合设计模式和编码规范能够增强代码的模块化和清晰度。举个例子,使用单例模式时,编码规范可能要求明确地在类的文档字符串中指出该类为单例,以及提供一个统一的方法来获取单例的实例。这有助于其他开发者理解代码的意图,同时遵循编码规范也能确保设计模式的正确实现和使用。 例如,考虑单例模式的Python实现。按照编码规范,我们可能需要添加文档字符串,并确保实例化过程不被外部直接调用: ```python class Singleton: """确保类只有一个实例,并提供一个全局访问点""" _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance def __init__(self): self.value = None # 其他方法... ``` 这段代码展示了一个单例模式的实现。我们通过覆盖 `__new__` 方法来确保类只创建一个实例。按照编码规范,我们还添加了文档字符串来说明 `Singleton` 类的行为。 ## 4.2 性能优化与编码规范 ### 性能优化的最佳实践 性能优化在编码规范中同样占有重要地位。性能优化通常涉及算法和数据结构的选择、循环优化、减少不必要的资源使用等。编码规范中会建议开发者遵循最佳实践,例如避免在循环内部调用耗时的函数,或者使用生成器来处理大数据集。 例如,在处理大型列表时,使用生成器可以节省内存: ```python def large_data_processing(data): # 使用生成器逐个处理数据,避免一次性将所有数据加载到内存 for item in data: # 处理数据项 ... ``` ### 保持性能优化与编码规范的一致性 在追求性能优化的同时,也应确保代码清晰易懂且遵循编码规范。这意味着在使用诸如内联函数、复杂的列表推导式或延迟计算等技巧时,需要在不牺牲代码可读性的前提下进行。 例如,使用列表推导式是Python中常见的代码优化方式之一,但应当保证其简洁性,以避免代码晦涩难懂: ```python # 简单的列表推导式 squares = [x * x for x in range(10)] ``` 在复杂的情况下,开发者可能需要在优化和清晰度之间找到平衡点,确保代码优化不会让同事感到困惑。 ## 4.3 编码规范与团队协作 ### 团队内代码风格统一的策略 团队协作时保持统一的代码风格至关重要。这不仅涉及到编码风格的统一,还包括了代码组织、命名规范和注释风格等。团队成员应共同遵循一套编码规范,以确保代码的整洁和一致性。团队领导或代码所有者在代码审查时应当强调这些规范的遵循。 例如,团队可以采用如下的命名约定: - 函数名使用小写字母,并使用下划线分隔单词:`get_user_info` - 类名首字母大写:`UserModel` - 常量全部大写,并使用下划线分隔单词:`MAX_USER_LIMIT` ### 跨团队协作时的编码规范整合 当多个团队合作时,整合各自不同的编码规范就显得尤为重要。通常,一个通用的规范需要在团队间达成共识,或者采用行业内广泛接受的规范,如PEP 8。整合过程应有清晰的沟通和文档记录,以确保所有成员都能迅速适应新的规范。 跨团队协作时,工具的选择也至关重要。可以使用版本控制系统中的钩子(hook)来强制执行编码规范,也可以设立公共的样式指南文档作为团队成员的参考。 总之,在进阶编码技巧的章节中,我们探索了设计模式在编码规范中的应用、性能优化与编码规范的结合以及编码规范与团队协作的关系。通过深入分析,我们发现设计模式能够提升代码结构的合理性,性能优化则需要考虑代码的可读性,而团队协作时的编码规范统一能够促进团队间的高效沟通和项目顺利实施。 # 5. 未来趋势与社区贡献 ## 5.1 编码规范的演变 编码规范并非一成不变。随着编程语言的进化、社区的发展以及新技术的出现,编码规范也在不断地演变和更新。对于Python等动态语言而言,这种变化尤为显著,因为它们更注重简洁性和灵活性。 ### 5.1.1 语言更新对编码规范的影响 Python作为一种活跃的语言,其版本更新往往会带来新的特性,这些新特性在解决旧问题的同时,也可能引入新的编码规范。例如,Python 3的推出,引入了print作为函数的使用,这改变了早期Python 2中的print语句用法。社区通过PEP (Python Enhancement Proposal) 来提案、讨论和推广新的编码规范,确保编码实践与时俱进。 ```python # Python 2中的print用法 print "Hello, World!" # Python 3中的print用法 print("Hello, World!") ``` 在实践中,开发者需要跟踪语言更新,理解新版本中推荐的编码规范,并将这些新规范应用到自己的项目中。一些集成开发环境(IDE)和编辑器可以帮助开发者自动适配新版本的代码风格。 ### 5.1.2 社区对编码规范的贡献和反馈 Python社区非常活跃,开发者们经常就编码规范进行讨论。通过邮件列表、论坛、会议等方式,社区成员可以贡献自己的观点和建议。此外,通过阅读和提交到开源项目,开发者可以直接观察并参与到实际的编码规范应用中,进而提出改进意见。 参与社区讨论有助于了解编码规范的最新动态,并能在解决实际问题时应用最佳实践。同时,贡献代码和反馈到社区也帮助其他开发者理解和接受新的编码规范。 ## 5.2 开源项目中的编码规范实践 开源项目是编码规范最佳实践的宝库。它们不仅展示了如何在大型项目中应用规范,还为开发者提供了一个学习和贡献的平台。 ### 5.2.1 参与开源项目中的编码规范讨论 许多开源项目都有自己的编码规范文档,它们通常包含在项目的README文件或者专门的CONTRIBUTING文件中。在这些文档中,项目维护者会详细说明代码应该如何提交,包括遵循PEP 8规范的要求。 参与开源项目中的讨论可以了解到规范在实际项目中的应用,并通过项目维护者的反馈来提升自己的编码技能。例如,当一个新手开发者提交了一个不符合项目规范的补丁时,项目维护者会指出需要改进的地方,并给出修改建议。 ```plaintext # 示例:GitHub上的贡献指南节选 ## How to contribute ### Following PEP 8 We try to follow the PEP 8 style guide as much as possible. If you have any suggestion or feedback on our coding style, please leave a comment in the related issue or pull request. ``` ### 5.2.2 开源项目对个人编码风格的塑造 在持续参与开源项目的过程中,个人的编码风格也会逐渐受到这些项目规范的影响。开发者会学习到如何编写更易于他人阅读和维护的代码,并逐步习惯于在日常工作中应用这些规范。 此外,参与开源项目还能提升开发者对不同编码风格的适应能力。开发者可能会在不同的项目中遇到不同的编码标准,理解并遵循这些标准有助于开发者在多环境中的灵活工作。 通过参与开源社区,开发者不仅能提升自己,还能为整个社区带来价值。通过分享个人经验、提供代码审查以及协助维护项目,开发者可以对编码规范的推广和改进做出贡献。这种贡献是双向的,既促进了社区的成长,又丰富了开发者自身的经验和技能。
corwn 最低0.47元/天 解锁专栏
买1年送1年
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

SW_孙维

开发技术专家
知名科技公司工程师,开发技术领域拥有丰富的工作经验和专业知识。曾负责设计和开发多个复杂的软件系统,涉及到大规模数据处理、分布式系统和高性能计算等方面。
专栏简介
本专栏全面涵盖 Python 编程规范和代码风格,旨在帮助开发者提升代码质量和开发效率。专栏内容包括: * 代码重构策略,让代码更易读、可维护 * 编码规范详解,统一团队代码风格 * 代码审查要点,确保代码质量 * 异常处理技巧,优雅解决运行时错误 * 内存管理精要,避免内存泄漏 * 函数式编程风格,提高代码效率和清晰度 * Python 在 Web 开发中的应用,框架选择和项目架构秘籍 * Python 与数据库交互,ORM 使用技巧和性能优化 * 数据可视化技巧,用图表讲好数据故事 * 网络编程技术,构建高效稳定的网络应用 * API 设计原则,创建清晰易用的接口 * 装饰器深入解析,揭秘函数增强背后的原理

专栏目录

最低0.47元/天 解锁专栏
买1年送1年
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

ROST软件数据可视化技巧:让你的分析结果更加直观动人

![ROST 使用手册](https://www.lifewire.com/thmb/b6j8BQ5vuxwWesp6d2vmPUHtrWQ=/1250x0/filters:no_upscale():max_bytes(150000):strip_icc()/ScreenShot2019-10-28at1.25.36PM-ab811841a30d4ee5abb2ff63fd001a3b.jpg) 参考资源链接:[ROST内容挖掘系统V6用户手册:功能详解与操作指南](https://wenku.csdn.net/doc/5c20fd2fpo?spm=1055.2635.3001.10343)

RTCM 3.3协议深度剖析:如何构建秒级精准定位系统

![RTCM 3.3协议深度剖析:如何构建秒级精准定位系统](https://www.geotab.com/CMS-Media-production/Blog/NA/_2017/October_2017/GPS/glonass-gps-galileo-satellites.png) 参考资源链接:[RTCM 3.3协议详解:全球卫星导航系统差分服务最新标准](https://wenku.csdn.net/doc/7mrszjnfag?spm=1055.2635.3001.10343) # 1. RTCM 3.3协议简介及其在精准定位中的作用 RTCM (Radio Technical Co

提升航空数据传输效率:AFDX网络数据流管理技巧

![AFDX 协议/ARINC664 中文版(第七部分)](https://www.electraic.com/images/galeri/galeri-1636371260548.jpg) 参考资源链接:[AFDX协议/ARINC664中文详解:飞机数据网络](https://wenku.csdn.net/doc/66azonqm6a?spm=1055.2635.3001.10343) # 1. AFDX网络技术概述 ## 1.1 AFDX网络技术的起源与应用背景 AFDX (Avionics Full-Duplex Switched Ethernet) 网络技术,是专为航空电子通信设计

软件开发者必读:与MIPI CSI-2对话的驱动开发策略

![软件开发者必读:与MIPI CSI-2对话的驱动开发策略](https://www.techdesignforums.com/practice/files/2016/11/TDF_New-uses-for-MIPI-interfaces_Fig_2.jpg) 参考资源链接:[mipi-CSI-2-标准规格书.pdf](https://wenku.csdn.net/doc/64701608d12cbe7ec3f6856a?spm=1055.2635.3001.10343) # 1. MIPI CSI-2协议概述 在当今数字化和移动化的世界里,移动设备图像性能的提升是用户体验的关键部分。为

【PCIe接口新革命】:5.40a版本数据手册揭秘,加速硬件兼容性分析与系统集成

参考资源链接:[2019 Synopsys PCIe Endpoint Databook v5.40a:设计指南与版权须知](https://wenku.csdn.net/doc/3rfmuard3w?spm=1055.2635.3001.10343) # 1. PCIe接口技术概述 PCIe( Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,被广泛应用于计算机内部连接高速组件。它以点对点连接的方式,能够提供比传统PCI(Peripheral Component Interconnect)总线更高的数据传输率。PCIe的进

ZMODEM协议的高级特性:流控制与错误校正机制的精妙之处

![ZMODEM 传输协议详解](https://www.smarthome.news/Newsimage/20200111003710.webp) 参考资源链接:[ZMODEM传输协议深度解析](https://wenku.csdn.net/doc/647162cdd12cbe7ec3ff9be7?spm=1055.2635.3001.10343) # 1. ZMODEM协议简介 ## 1.1 什么是ZMODEM协议 ZMODEM是一种在串行通信中广泛使用的文件传输协议,它支持二进制数据传输,并可以对数据进行分块处理,确保文件完整无误地传输到目标系统。与早期的XMODEM和YMODEM协

IS903优盘通信协议揭秘:USB通信流程的全面解读

![银灿 IS903 优盘原理图](http://www.usbdev.ru/images/files/is903datasheet1.png) 参考资源链接:[银灿IS903优盘完整的原理图](https://wenku.csdn.net/doc/6412b558be7fbd1778d42d25?spm=1055.2635.3001.10343) # 1. USB通信协议概述 USB(通用串行总线)通信协议自从1996年首次推出以来,已经成为个人计算机和其他电子设备中最普遍的接口技术之一。该章节将概述USB通信协议的基础知识,为后续章节深入探讨USB的硬件结构、信号传输和通信流程等主题打

【功能拓展】创维E900 4K机顶盒应用管理:轻松安装与管理指南

参考资源链接:[创维E900 4K机顶盒快速配置指南](https://wenku.csdn.net/doc/645ee5ad543f844488898b04?spm=1055.2635.3001.10343) # 1. 创维E900 4K机顶盒概述 在本章中,我们将揭开创维E900 4K机顶盒的神秘面纱,带领读者了解这一强大的多媒体设备的基本信息。我们将从其设计理念讲起,探索它如何为家庭娱乐带来高清画质和智能功能。本章节将为读者提供一个全面的概览,包括硬件配置、操作系统以及它在市场中的定位,为后续章节中关于设置、应用使用和维护等更深入的讨论打下坚实的基础。 创维E900 4K机顶盒采用先

【cx_Oracle数据库管理】:全面覆盖连接、事务、性能与安全性

![【cx_Oracle数据库管理】:全面覆盖连接、事务、性能与安全性](https://opengraph.githubassets.com/4c15efa3aed896d2d8461e5c45b57ec1b4b940671656474977125616ae893db6/oracle/python-cx_Oracle) 参考资源链接:[cx_Oracle使用手册](https://wenku.csdn.net/doc/6476de87543f84448808af0d?spm=1055.2635.3001.10343) # 1. cx_Oracle数据库基础介绍 cx_Oracle 是一个

【深度学习的交通预测力量】:构建上海轨道交通2030的智能预测模型

![【深度学习的交通预测力量】:构建上海轨道交通2030的智能预测模型](https://img-blog.csdnimg.cn/20190110103854677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNjY4ODUxOQ==,size_16,color_FFFFFF,t_70) 参考资源链接:[上海轨道交通规划图2030版-高清](https://wenku.csdn.net/doc/647ff0fc

专栏目录

最低0.47元/天 解锁专栏
买1年送1年
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )