
在日常开发中,规范的代码结构可以提高代码阅读性,方便后期维护,在开源项目中尤为重要。毕竟谁也不想让人将自己的代码称为"屎山",这里将日常开发中需要注意的点进行总结。
适用于 Python 初学者希望编写更高效代码的学习者,也适用于经验丰富的开发者优化现有项目的实践者。希望通过本指南,让开发者能够掌握 Python 代码优化的核心技巧,提升代码质量,减少运行时间,并增强代码的可扩展性和可维护性。
注释放在开头的原因是因为注释在开发中重要,最基本的需要在每个方法中标出该方法的功能,传递的参数、返回值的类型和解释.在Python中推荐使用"""进行标记注释,例如下面这个读取yml配置文件功能的方法:
def load_config(config_path:str)->Dict[str,Any]:
"""
从路径中读取yml数据
Args:
config_path(str): yml文件的路径
Returns:
Dict[str,Any]: 配置文件的字典数据
"""
with open(config_path,"r") as config_file:
return yaml.safe_load(config_file)这样做的另一个好处是在使用编辑器(VsCode)时,可以在鼠标指向调用方法可以弹出功能说明和传参等提示,方便维护和别人调用模块参数.内容如下:
(function) def load_config(config_path: str) -> Dict[str, Any]
从路径中读取yml数据
Args
config_path : str
yml文件的路径
Returns
Dict[str,Any]
配置文件的字典数据在使用条件语句时有两个可优化点,第一个是if...else....嵌套可以转变为先判断否定的参数的返回方法,这样写可读性更高.例如:
with LOCK:
chatIds=get_chat_id_list(symbol)
if chatId not in chatIds:
return False
chatIds.remove(chatId)
DB.update(set("chatIds", chatIds),QUERY.symbol==symbol)
return True在上面的例子中,没有先判断chatId在chatIds中,而是先进行否定判断,这样可以减少else的嵌套并且使可读性更强.
第二个是在进行简单的if.....else....返回值时可以使用三元运算符形式直接返回.
if data_class is None: # 当未配置data_class时,返回默认的字典数据
return res_json if res_json else None这里在判断res_json是否为有数据时直接使用三元运算符,在无数据时返回None,简化了if....else的编写.
方法参数与返回值都应该标明具体的类型,因为在不标明参数类型的,Python默认使用any类型,这为后期的维护工作埋下了"炸弹",当项目结构越来越复杂时,可能自己都看不懂具体返回了什么数据.推荐进行传参和返回值的标识,无返回值的参数应该标识为None:
def send_request(url:str,headers:str)->Dict[str,Any]:在进行异常捕获时,不要使用以下格式进行大范围的捕获:
try:
{代码块}
except Exception as e:
{异常输出}应该详细了解自己捕获的方法会报出具体的哪些异常类型,这样做的好处时当报错时,可以清楚的看到错误数据哪个错误发出的.例如以下格式:
try:
response=requests.get(url,headers,timeout=5)
response.raise_for_status()
resJson=response.json()
return resJson
except RequestException as e:
print(f"RequestException:{e}")
except (ValueError,TypeError) as e:
print(f"Json Decoder Error:{e}")
except Exception as e:
print(f"Exception Error:{e}")
return None这样捕获时,请求错误会被RequestException捕获,数据解析错误可以被 (ValueError,TypeError)错误捕获,通过自定义打印的字符串可以很清楚的知道因为什么报的错误,以此定位问题所在.
在使用字典取值时应该使用以下方式进行取值:
self.symbol=stats_data.get("symbol","")使用以上方式的好处时,可以在取值时默认值,不会发生取值异常,这会降低程序运行的稳定性.而不是直接使用以下方式进行取值:
self.symbol=stats_data["symbol"]当进行简单的列表的循环操作时,可以使用列表推导式进行简化,例如:
from typing import Type,T,List
def parse_list(data_list:List, cls: Type[T]):
"""
通用方法,将列表中的每一项转换为指定的类实例。
:param data_list: 需要转换的数据列表
:param cls: 目标类,用于实例化列表中的每一项
:return: 转换后的对象列表
"""
return [cls(item) for item in data_list]上述代码中使用列表推导式完成了列表中整体对象的封装,而不是使用for循环每一项进行封装.
如果存在大量需要经常改动的静态字符串,如API_KEY、密码等,这些可以独立到单独的配置文件中.程序启动时从配置文件中进行读取.一些固定的字符串的如请求URL、标识、提示等需要放在一个单独的文件内进行整体管理,这样可以方便维护.
在 Python 开发中,良好的代码风格和优化技巧能提高代码的可读性、可维护性,并减少潜在错误。以上是我在日常开发中的一些总结,如果你有更好的优化,或其它方面的对代码规范、可读性改进的方法,欢迎在评论区留言(虚心学习)。