”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Python:有趣的代码模式

Python:有趣的代码模式

发布于2024-11-08
浏览:697

Python: Interesting Code Patterns

我主要使用 Python 工作,几乎每天都会检查代码。在我们的代码库中,格式化和 linting 由 CI 作业使用 black 和 mypy 处理。因此,我们只关注变化。

在团队中工作时,您已经知道某个团队成员会编写什么样的代码。当新人加入团队时,代码审查会变得有趣。我说有趣,是因为每个人都有一些他们不自觉地使用的编码风格;无论好坏!就像我有一些,

  1. 设置Optionaltype的值。 通常这些变量是签名的一部分
# I used (long back) to do

def func(a: int, b: Optional[list] = None, c: Optional[Dict] = None):

    if b is None:
       b = []
    if c is None:
       c = {}

# Instead I do

def func(a: int, b: Optional[list] = None, c: Optional[Dict] = None):

    b = b or []
    c = c or {}
  1. 使用 dict 处理简单的 if..elif..else (最多 3-4 个)语句

这是一个简单的用例,您返回一个字符串或根据某个值调用一个函数

注意:从 3.10 开始你应该使用 match 而不是 this。

而不是做,

def get_number_of_wheels(vehicle: str):
    if vehicle == "car":
        wheels = 2
    elif vehicle == "bus":
        wheels = 6
    elif vehicle == "bicycle":
        wheels = 2
    else:
        raise ...

# I prefer doing, 

def get_number_of_wheels(vehicle: str):
    return {
       "car": 2,
       "bus": 6,
       "bicycle": 2
    }[vehicle]       # Raise is now KeyError

上面是几个例子,审阅我的代码的人将会有更多的例子。

最近,一位新开发人员加入了我的团队,我注意到了一种我喜欢的模式,但我要求将其更改为简单的 if..else 情况。我会先向您展示模式,然后给出我要求更改的理由。

该代码是一个装饰器,它对参数进行一些操作。让我们编写一个简单的(无用的)装饰器,它将打印调用函数/方法的参数和 kwargs 的数量。

def counter(is_cls_method: bool = False):
    """ print number of args & kwargs for func/method """
    def outer(f):
        def inner(*args, **kwargs):
            args_cnt = len(args)
            kwargs_cnt = len(kwargs)
            print(f"{f.__name__} called with {args_cnt=} & {kwargs_cnt=}")
            return f(*args, **kwargs)
        return inner
    return outer

@counter()
def test1(a, b, c):
    pass

class A:
    @counter(is_cls_method=True)
    def test1(self, a, b, c):
        pass


print("function")
test1(1, 2, c=3)
test1(a=1, b=2, c=3)

print("method")
a = A()
a.test1(1, 2, 3)
a.test1(1, b=2, c=3)

运行此代码时,您应该看到

function
test1 called with args_cnt=2 & kwargs_cnt=1
test1 called with args_cnt=0 & kwargs_cnt=3

method
test1 called with args_cnt=4 & kwargs_cnt=0
test1 called with args_cnt=2 & kwargs_cnt=2

它工作得很好,但是对于方法来说,它也在计算自我。所以让我们解决这个问题!

def counter(is_cls_method: bool = False):
    def outer(f):
        def inner(*args, **kwargs):
            args_cnt = len(args)

            if is_cls_method:   # Check added
               args_cnt -= 1    # Reduced count by 1

            kwargs_cnt = len(kwargs)
            print(f"{f.__name__} called with {args_cnt=} & {kwargs_cnt=}")
            return f(*args, **kwargs)
        return inner
    return outer

这是一个简单的 if 子句,但新开发人员做了其他一些有趣的布尔值使用。

我只显示更改后的代码...

   args_cnt = len(args[is_cls_method:])

解决方案比使用 if 好得多,因为 python 中的 bool 只是 int 。原始代码有点长,注意到这个小变化并不明显,基本 Python 用户使用的代码库也是如此。而且,如果你必须猜测一条线在做什么,我认为你应该改变以使其明显。

您对此有何看法,您使用布尔值作为索引吗?
你还有更多这样的Python模式吗?

版本声明 本文转载于:https://dev.to/ninadmhatre/python-interesting-code-patterns-dh3?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Java 的内置功能如何可靠地验证电子邮件地址?
    Java 的内置功能如何可靠地验证电子邮件地址?
    探索 Java 中的电子邮件验证方法电子邮件地址的有效性在各种应用中至关重要。虽然 Apache Commons Validator 一直是 Java 电子邮件验证的流行选择,但开发人员经常寻求替代解决方案。本文深入研究了使用官方 Java 电子邮件包验证电子邮件地址的综合方法。isValidEma...
    编程 发布于2024-12-22
  • 掌握 JavaScript 中的对象
    掌握 JavaScript 中的对象
    JavaScript 中的对象 在 JavaScript 中,对象是键值对的集合,其中值可以是数据(属性)或函数(方法)。对象是 JavaScript 的基础,因为 JavaScript 中几乎所有内容都是对象,包括数组、函数,甚至其他对象。 1.创建对象 ...
    编程 发布于2024-12-22
  • C++ 中与运算符 (&) 的使用方式有哪些不同?
    C++ 中与运算符 (&) 的使用方式有哪些不同?
    && 在 C 语言中如何工作 理解 & 运算符& C 中的运算符有多种用途,包括:获取某个地址变量: &x 返回变量 x 的内存地址。通过引用传递参数: void foo(CDummy& x);通过引用将变量 x 传递给函数 foo,允许在 foo 内部所做的修改反映在原始变量中。声明引用变量: i...
    编程 发布于2024-12-22
  • 马尼拉 DevFest 推动创新、包容性和负责任的人工智能
    马尼拉 DevFest 推动创新、包容性和负责任的人工智能
    图片来自GDG Manila Facebook页面(https://m.facebook.com/story.php?story_fbid=pfbid02Xh4ED8NwUnfrh9wrDS2pJKhYbpya4QxCMFWcNCeKuCpg9LgkmQ96B85FUSqo5w7bl&id=6156...
    编程 发布于2024-12-22
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-12-22
  • C++中静态工厂方法和工厂类如何选择?
    C++中静态工厂方法和工厂类如何选择?
    如何在 C 中正确实现工厂方法模式 工厂方法模式是一种设计模式,允许创建对象而无需指定对象的确切类要创建的对象。当运行时确定要创建的对象的类时,或者需要提供统一的接口来创建不同类型的对象时,通常会使用这种模式。在 C 中,有以下几种方式实现工厂方法模式。一种常见的方法是使用在要为其创建对象的类中定义...
    编程 发布于2024-12-22
  • Java 中的 HashMap 或 Hashtable:对于单线程应用程序来说,哪个更高效?
    Java 中的 HashMap 或 Hashtable:对于单线程应用程序来说,哪个更高效?
    Java 中的 HashMap 与 Hashtable:非线程应用程序的主要区别和效率HashMap 和 Hashtable 是 Java 中的基本数据结构,它们存储键值对。了解它们的区别对于选择最合适的选项至关重要。主要区别:同步: Hashtable 是同步的,而 HashMap 是同步的不是。...
    编程 发布于2024-12-22
  • MySQL 能否处理遥远过去的日期,例如 1200 年?
    MySQL 能否处理遥远过去的日期,例如 1200 年?
    MySQL 对历史日期的支持许多数据库系统,包括 MySQL,在处理历史日期时都有局限性。本文探讨了存储和使用公历之前的日期的限制和替代方案。MySQL 可以处理像 1200 这样的日期吗?从技术上讲,MySQL 可以存储日期早在 1000 年。然而,对于在此之前的日期,存在潜在的问题考虑。历史日期...
    编程 发布于2024-12-22
  • 如何检测和计算 PHP 数组中的唯一值?
    如何检测和计算 PHP 数组中的唯一值?
    检测并显示数组中唯一值的出现在 PHP 中,使用数组通常涉及处理重复值。为了有效地管理和分析数据,必须识别并计算这些重复出现的次数。让我们探索针对这一挑战的详细解决方案。使用 array_count_values() 函数提供了一种简单的方法。该函数接受一个数组作为输入并返回一个关联数组,其中键代表...
    编程 发布于2024-12-22
  • HTML 格式标签
    HTML 格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2024-12-22
  • 如何避免 JavaScript 中 parseInt 的八进制解释问题?
    如何避免 JavaScript 中 parseInt 的八进制解释问题?
    JavaScript 的八进制危险:parseInt 错误行为的解决方法JavaScript 的 parseInt 函数在遇到带有前导零的数字时可能会出错。该问题源于其将前导零解释为八进制数字的倾向,从而导致错误的结果。示例:parseInt('01'); // 1 parseInt('08'); ...
    编程 发布于2024-12-22
  • Golang 是否提供移动语义,它如何实现类似的优化?
    Golang 是否提供移动语义,它如何实现类似的优化?
    Golang 中的移动语义Bjarne Stroustrup 在 C 11 中引入了移动语义,通过消除不必要的复制来优化数据传输。这种技术在处理大型数据结构时特别有用。Golang 支持移动语义吗?与 C 不同,Golang 不以同样的方式明确支持移动语义。然而,Go 采用了一种独特的方法,通过其内...
    编程 发布于2024-12-22
  • Go ":=" 与 "=":何时使用短变量声明?
    Go ":=" 与 "=":何时使用短变量声明?
    理解Go中“:=”和“=”的区别作为Go新手,你可能会困惑对于变量赋值,“:=”和“=”似乎可以互换使用。然而,围绕变量声明的上下文有一个微妙的区别。“=”的作用在 Go 中,“=”主要用于变量赋值。它遵循“var name type = expression”的语法,其中“name”代表要分配的变...
    编程 发布于2024-12-22
  • 如何在 Python 中创建类似 Cron 的调度?
    如何在 Python 中创建类似 Cron 的调度?
    Python 类 Cron 调度基于灵活表达式的调度任务的需求出现在各种环境中。虽然 cron 在许多环境中都能实现此目的,但它可能并不普遍可用或可行。在这种情况下,Python 提供了多种选项来创建您自己的类似 cron 的调度程序。使用调度库的轻量级方法如果轻量级且纯基于 Python 的解决方...
    编程 发布于2024-12-22
  • 如何防止 JDBC 应用程序中的 ORA-01000:最大打开游标错误?
    如何防止 JDBC 应用程序中的 ORA-01000:最大打开游标错误?
    管理游标和 JDBC 对象以防止 ORA-01000了解游标和 JDBC 之间的连接当数据库实例耗尽可用空间时,会发生 ORA-01000 最大打开游标错误游标。数据库上的单个游标支持每个 JDBC ResultSet。每个 JDBC Connection 可以处理多个事务,但一次只能处理一个事务。...
    编程 发布于2024-12-22

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3