美文网首页
命名规范与正则表达式

命名规范与正则表达式

作者: 虚胖一场 | 来源:发表于2020-04-10 22:11 被阅读0次

本文链接个人站 | 简书 | CSDN
版权声明:除特别声明外,本博客文章均采用 BY-NC-SA 许可协议。转载请注明出处。

根据 Google Python Style Guide,Python 中的参数名一般为 lower_with_under 风格。而根据 Google Java Style Guide, Java 中的参数名一般为 lowerCamelCase 风格。那么问题来了,假如你写了一个 Python 算法服务供 Java 后端调用,设计接口的时候参数名应该采用什么命名风格呢?我工作中就遇到过这个问题。使用 Python 风格吧,后端同学用起来不方便;使用 Java 风格吧,作为一个强迫症我又很难受。有没有两全其美的办法呢?

后端在调用接口的时候,使用 json 格式传递参数,算法接收到之后将 json 串反序列化为字典。借助正则表达式,我们可以把字典的 key 由 Java 风格转化为 Python 风格:

import re

def camel_to_snake(camelCase: str) -> str:
    """
    convert CamelCase string into snake_case string.
    """
    pattern = re.compile(r'([a-z]|\d)([A-Z])')
    snake_case = re.sub(
        pattern=pattern,
        repl=r'\1_\2',
        string=camelCase).lower()
    return snake_case

等等……我们不会是要遍历字典,逐个转换吧?如果是字典套字典的情况呢?难不成还写个递归?写这样的代码不会挨打吗?其实大可不必如此,我们可以在接收到 json 串之后先用正则表达式匹配出 key,一次性转换,然后再将 json 反序列化。

def json_camel_to_snake(camelCaseJsonStr: str) -> str:
    """
    convert CamelCase keys inside a json string into snake_case keys.
    """
    pattern = re.compile(r'"\s*(\w+)\s*"\s*:')
    snake_case_json_str = re.sub(
        pattern=pattern,
        repl=lambda s: '"' + camel_to_snake(s.group(1)) + '":',
        string=camelCaseJsonStr
    )
    return snake_case_json_str

进一步地,我们的算法服务的返回结果也可以在序列化为 json 串后,用正则表达式把所有的 key 从 Python 风格一键转化为 Java 风格,然后再传给用户。

def snake_to_camel(snake_case: str) -> str:
    """
    convert snake_case string into CamelCase string.
    """
    pattern = re.compile(r'(_\w)')
    camelCase = re.sub(
        pattern=pattern,
        repl=lambda s: s.group(1)[1].upper(),
        string=snake_case
    )
    return camelCase

def json_snake_to_camel(snake_case_json_str: str) -> str:
    """
    convert snake_case keys inside a json string into CamelCase keys.
    """
    pattern = re.compile(r'"\s*(\w+)\s*"\s*:')
    camelCaseJsonStr = re.sub(
        pattern=pattern,
        repl=lambda s: '"' + snake_to_camel(s.group(1)) + '":',
        string=snake_case_json_str
    )
    return camelCaseJsonStr

完。

相关文章

  • k8s基础知识

    Namespace命名规范:命名空间名称满足正则表达式a-z0-9?,最大长度为63位 kubeadm init初...

  • 命名规范与正则表达式

    本文链接:个人站 | 简书 | CSDN版权声明:除特别声明外,本博客文章均采用 BY-NC-SA 许可协议。转载...

  • 适合各厂使用的 MySQL 团队开发规范,太详细了,建议收藏!

    数据库对象命名规范 数据库对象 数据库对象全局命名规范 数据库命名规范 表命名规范 字段命名规范 索引命名规范 视...

  • 代码书写规范

    res命名规范: src中命名规范: 习惯命名:

  • CSS Guide

    文档目录 命名规范 代码风格 通用 值与单位 文本排版 变换与动画 媒体查询 兼容性 代码注释 1 命名规范 该命...

  • 领域驱动设计与工程构建规范

    在领域驱动的理念基础下,定义工程命名规范和包路径规范,与大家交流命名规范。在此使用java实现工程,运行生成初始开...

  • Android开发中的优化方案

    一、命名规范 代码规范先从命名规范开始,Android的命名规范主要涉及:Java源代码,xml文件,图片资源。 ...

  • Swift--规范编程

    命名规范 注释规范 声明 代码排版 命名规范 常用命名方法 匈牙利命名,一般只是命名变量,原则是: 变量名 = 类...

  • 6 ThinkPHP5的命名规范与目录结构:很重要哦~

    6 ThinkPHP5的命名规范与目录结构:很重要哦~ 一. 命名规范1.匈牙利命名法:标识符中的每个单词之间用下...

  • Flutter 代码规范

    命名规范 命名规范中包括了文件以及文件夹的命名规范,常量和变量的命名规范,类的命令规范。Dart 中只包含这三种命...

网友评论

      本文标题:命名规范与正则表达式

      本文链接:https://www.haomeiwen.com/subject/aosjmhtx.html