首页 > 编程语言 >【Python学习004】Pythonic代码风格(一)

【Python学习004】Pythonic代码风格(一)

时间:2023-02-05 18:00:50浏览次数:61  
标签:... Pythonic Python items self str 004 def more

Pythonic 代码风格(一)

大家好,我们的gzh是朝阳三只大明白,满满全是干货,分享近期的学习知识以及个人总结(包括读研和IT),跪求一波关注,希望和大家一起努力、进步!!

命名

命名的核心目的在于让其他开发者在不了解细节的情况下依旧能读懂代码,符合一定命名规范的代码具有更好的可读性。

命名风格

snake_case

多个单词之间使用下划线进行分割,所有的单词都是小写,具体示例如下:

def is_valid():
...

def get_col_cnt():
...

def is_minimized():
...

camelCase

词和词之间没有分割符,首个词小写,其他单词都是大写,示例如下:

def isValid():
...

def getColCnt():
...

def isMinimized():
...

PascalCase

词和词之间没有分割符,所有的单词首字母大写,示例如下:

class AdminRole:
...

class Admin:
...

class StreamGraph:
...

命名的基本要求

  • 值或者对象:使用简短的名词搭配形容词;
  • 函数或者方法:使用动词搭配形容词;
  • 类:使用简短的名词组合。

命名变量、常量和属性

命名常量、变量和属性一般采用【名词+形容词】的组合,具体示例如下:

  • 命名一个对象:通常采用snake_case 方式进行命名,例如 ​​authorized_user​​​、​​sql_database​​;
  • 命名一个数值类型或者字符串:通常采用snake_case 方式进行命名,添加形容词或者名词添加更多描述信息,例如 ​​full_name​​​,​​first_name​​​、​​age​​ ;
  • 命名一个布尔类型:通常采用snake_case 方式进行命名,通常以has开头,例如 ​​has_active​​​、​​has_minimized​​​、​​has_foucus​​。

命名函数或者方法

命名一个函数或者方法,通常以一个动词开头,对于表现一个行为的函数或者方法,命名应当描述那一次操作的目的,示例如下:

def get_active_user(...):
...

def append_data(...):
...

def get_user_by_email(...):
...

对于返回值是布尔类型的方法或函数,应当以is开头的疑问形式命名,示例如下:

def is_email_valid():
...

def is_empty():
...

def is_fullscreen():
...

命名类

命名类一般采用 PascalCase 格式命名,类的命名应当反应其所表现的抽象,其示例如下:

class Customer:
...

class User:
...

class Admin:
...

小结

根据上述原则,我个人推荐的规则如下:

Type

命名约定

例子

Function

使用小写单词、下划线分割

function, a_function

method

使用小写单词、下划线分割

method, a_method

Variable

使用小写单词、下划线分割

hero, shopping_cart

Constant

使用大写单词、下划线分割

MAX_SIZE, LEVEL

Class

PascalCase 写法 ,首字母大写

Order,UserOrder

Module

使用小写单词、下划线分割

user_order.py

Package

简短的小写单词,不要使用下划线

user

合理的结构

合理的类结构

class ClassName:
# 类变量
DEFAULT_TITLE: AnyStr = 'title'
...

# init方法
def __init__(self, ...):
pass

# 魔术方法
def __repr__(self, ...):
pass

# 类方法
@classmethod
def method(...):
pass

# 静态方法
@staticmethod
def method(...):
pass

# 私有方法
def __method(self, ...):
pass

# getter、setter方法
@property
def method(self):
...

# 实例方法
def method(self, ...):
pass

合理的 try-catch 结构

import traceback
try:
f()
except ValueError:
...

except NameError:
...

except Exception as e:
print(e)
trackback.print_exc()

else:
# 无错误的处理方式
finally:
...

示例

Sidebar 示例

class SideBar:  
DIV: str = 'div'
H1: str = 'h1'
MORE: str = 'more'
MORE_ITEMS_LENGTH: int = 3
SHOULD_COMPRESS_HTML: bool = True

def __init__(
self,
title: str,
menu_items: [str],
more: str = MORE,
more_items_length: int = MORE_ITEMS_LENGTH,
should_compress_html: bool = SHOULD_COMPRESS_HTML
) -> None:
self.title = title
self.more = more
self.more_items_length = more_items_length
self.should_compress_html = should_compress_html
self.menu_items = menu_items

def __len__(self):
return len(self.menu_items)

def __repr__(self):
return f'SideBar: {len(self)} menu items'
@classmethod
def _header(cls, title):
return cls._build_header(cls.H1, title)

@classmethod
def _body(cls, menu_items: [str], should_compress_html: bool) -> str:
split_char = cls._get_split_char(should_compress_html)
return split_char.join(
list(cls._build_body(cls.DIV, menu_items))
)

@classmethod
def _more(cls, more):
return cls._build_more(cls.DIV, more)

@staticmethod
def _build_header(tag_name: str, title: str) -> str:
return f'<{tag_name}>{title}</{tag_name}>'

@staticmethod
def _build_body(tag_name: str, menu_items: [str]) -> str:
for menu_item in menu_items:
yield f'<{tag_name}>{menu_item}</{tag_name}>'

@staticmethod
def _build_more(tag_name: str, text: str) -> str:
return f'<{tag_name}>{text}</{tag_name}>'

@staticmethod
def _get_split_char(should_compress_html: bool) -> str:
return '' if should_compress_html else '\n'

def _is_few_items(self):
return len(self) < self.more_items_length

def build(self) -> str:
header = self._header(self.title)
body = self._body(self.menu_items, self.should_compress_html)
footer = self._more(self.more) if self._is_few_items() else ''
split_char = self._get_split_char(self.should_compress_html)
html = split_char.join([header, body, footer])
return html


if __name__ == '__main__':
side_bar = SideBar(
'DEMO SIDE BAR',
['a', 'b', 'c'],
should_compress_html=False,
more_items_length=3
)
print(side_bar.build())

往期回顾

  1. ​【Python学习003】高效数据结构-列表​
  2. ​【Python学习002】函数参数​


文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!

标签:...,Pythonic,Python,items,self,str,004,def,more
From: https://blog.51cto.com/u_15945763/6038321

相关文章

  • 用GPU来运行Python代码
    简介前几天捣鼓了一下Ubuntu,正是想用一下我旧电脑上的N卡,可以用GPU来跑代码,体验一下多核的快乐。还好我这破电脑也是支持Cuda的:$sudolshw-Cdisplay*-display......
  • 【python装饰器:参数,顺序,场景】
    一、装饰器是什么?装饰器,顾名思义,就是增强函数或类的功能的一个函数。作用:在不修改功能代码的同时,给代码扩展新的功能,可以装饰函数,也可以装饰类。举个例子:如何计算函数的执......
  • python-conftest、fixture、matefunc介绍
    pytest的规则使用"""使用pytest编写用例,必须遵守以下规则:(1)测试文件名必须以“test_”开头或者"_test"结尾(如:test_ab.py)(2)测试类命名以"Test"开头。(3......
  • python接口自动化-logging日志
    logging模块的日志级别:日志级别一共有5个从低到高如下,作用是在当你给python函数赋予日志器时,需要自己标记日志级别(后面会用到)DEBUG(调试级别):严重程度最低级别,详细程度最......
  • RBMQ中python案例一:简单模式
    一、生产者与消费者模式之简单模式,原理图   二、生产者产生消息importjsonimportpikaimportdatetime#生产者producer.pydefget_message():#......
  • python-pytest.ini介绍
    一、pytest.ini执行方式含义[pytest]addopts=-vsq--html=./report.htmltestpaths=./testConftestpython_files=test*.pypython_classes=Test*python_func......
  • Mac-pycharm执行python3 manage.py makemigrations报错处理
    Mac-pycharm执行python3manage.pymakemigrations报错处理1报错:NameError:name'_mysql'isnotdefined参考:https://blog.csdn.net/weixin_35757704/article/detail......
  • Python黑客编程之tcp代理
    目的写一款socket代理工具,其实就是在原来两极通信中再加一极,中间极用来转发socket的流量,可以在中间层面实现流量的拦截和篡改代码代理importsocketimportsysim......
  • python collection Chainmap Counter
    chainmap是一个方便的工具类。它是使用链的方式将多个dict链在一起,并不是真正的生成一个新的dict,从而允许程序可以这获取任意一个dict所包含的所有key对应的value。但是......
  • 整理我遇到的 Python 的疑难问题
    1如果字典里一个键指向一个实例,深拷贝会拷贝出一个新的实例吗?不会:classfoo:def__init__(self):print('doinitfoo')a={'cls':foo()}a#......