Python 中的常见陷阱[重复]

2024-03-06

时隔多年,今天我再次被可变的默认参数所困扰。除非需要,我通常不会使用可变的默认参数,但我想随着时间的推移我忘记了这一点。今天在应用程序中,我在 PDF 生成函数的参数列表中添加了 tocElements=[] ,现在每次调用“生成 pdf”后“目录”变得越来越长。 :)

我还应该在必须避免的事情清单中添加哪些内容?

  • 始终以相同的方式导入模块,例如from y import x and import x are 被视为不同的模块 https://stackoverflow.com/questions/1459236/module-reimported-if-imported-from-different-path.

  • 不使用range代替列表,因为range()无论如何都会成为迭代器,以下将失败:

      myIndexList = [0, 1, 3]
      isListSorted = myIndexList == range(3)  # will fail in 3.0
      isListSorted = myIndexList == list(range(3))  # will not
    

    同样的事情可能会被错误地完成xrange:

      myIndexList == xrange(3)
    
  • 小心捕获多种异常类型:

      try:
          raise KeyError("hmm bug")
      except KeyError, TypeError:
          print TypeError
    

    这会打印“hmm bug”,尽管它不是一个错误;看起来我们正在捕获两种类型的异常,但实际上我们只是将 KeyError 作为变量捕获类型错误,使用这个代替:

      try:
          raise KeyError("hmm bug")
      except (KeyError, TypeError):
          print TypeError
    

不要使用索引来循环序列

Don't :

for i in range(len(tab)) :
    print tab[i]

Do :

for elem in tab :
    print elem

For将为您自动化大多数迭代操作。

Use enumerate http://docs.python.org/library/functions.html#enumerate如果您确实需要索引和元素。

for i, elem in enumerate(tab):
     print i, elem

使用“==”进行检查时要小心True or False

if (var == True) :
    # this will execute if var is True or 1, 1.0, 1L

if (var != True) :
    # this will execute if var is neither True nor 1

if (var == False) :
    # this will execute if var is False or 0 (or 0.0, 0L, 0j)

if (var == None) :
    # only execute if var is None

if var :
    # execute if var is a non-empty string/list/dictionary/tuple, non-0, etc

if not var :
    # execute if var is "", {}, [], (), 0, None, etc.

if var is True :
    # only execute if var is boolean True, not 1

if var is False :
    # only execute if var is boolean False, not 0

if var is None :
    # same as var == None

不要检查是否可以,只要执行并处理错误

Python 爱好者通常会说“请求宽恕比请求许可更容易”。

Don't :

if os.path.isfile(file_path) :
    file = open(file_path)
else :
    # do something

Do :

try :
    file =  open(file_path)
except OSError as e:
    # do something

或者使用 python 2.6+ / 3 甚至更好:

with open(file_path) as file :

它要好得多,因为它更通用。您几乎可以将“尝试/例外”应用于任何事情。您不需要关心如何防止它发生,只需要关心您所面临的错误风险。

不检查类型

Python 是动态类型的,因此检查类型会让你失去灵活性。相反,通过检查行为来使用鸭子类型。例如,您期望函数中有一个字符串,然后使用 str() 转换字符串中的任何对象。如果您需要一个列表,请使用 list() 转换列表中的任何可迭代对象。

Don't :

def foo(name) :
    if isinstance(name, str) :
        print name.lower()

def bar(listing) :
    if isinstance(listing, list) :
        listing.extend((1, 2, 3))
        return ", ".join(listing)

Do :

def foo(name) :
    print str(name).lower()

def bar(listing) :
    l = list(listing)
    l.extend((1, 2, 3))
    return ", ".join(l)

使用最后一种方式, foo 将接受任何对象。 Bar 将接受字符串、元组、集合、列表等等。便宜的干:-)

不要混合使用空格和制表符

只是不要。你会哭的。

Use object作为第一父母

这很棘手,但随着程序的增长,它会困扰你。 Python 2.x 中有新旧类。旧的,嗯,旧的。它们缺乏一些功能,并且在继承方面可能会出现尴尬的行为。为了可用,你的任何班级都必须是“新风格”。为此,请使其继承自“object”:

Don't :

class Father :
    pass

class Child(Father) :
    pass

Do :

class Father(object) :
    pass


class Child(Father) :
    pass

在 Python 3.x 中,所有类都是新样式,因此您可以声明class Father:很好。

不要在外部初始化类属性__init__ method

来自其他语言的人会发现它很有吸引力,因为你可以用 Java 或 PHP 来完成这项工作。您编写类名,然后列出您的属性并为其指定默认值。它似乎在Python中工作,但是,这并不像你想象的那样工作。

这样做将设置类属性(静态属性),然后当您尝试获取对象属性时,它将为您提供其值,除非它为空。在这种情况下,它将返回类属性。

这意味着两大危险:

  • 如果类属性更改,则初始值也会更改。
  • 如果将可变对象设置为默认值,您将获得跨实例共享的同一对象。

不要(除非你想要静态):

class Car(object):
    color = "red"
    wheels = [wheel(), Wheel(), Wheel(), Wheel()]

Do :

class Car(object):
    def __init__(self):
        self.color = "red"
        self.wheels = [wheel(), Wheel(), Wheel(), Wheel()]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的常见陷阱[重复] 的相关文章

  • 如何恢复tensorflow inceptions检查点文件(ckpt)?

    I have inception resnet v2 2016 08 30 ckpt文件是预先训练的初始模型 我想使用恢复这个模型 saver restore sess ckpt filename 但为此 我将需要编写训练该模型时使用的变量
  • 在 Python 中解析 TCL 列表

    我需要在双括号上拆分以空格分隔的 TCL 列表 例如 OUTPUT 172 25 50 10 01 01 Ethernet 172 25 50 10 01 02 Ethernet Traffic Item 1 172 25 50 10 01
  • 如何传递架构以从现有数据帧创建新数据帧?

    要将 schema 传递到 json 文件 我们这样做 from pyspark sql types import StructField StringType StructType IntegerType data schema Stru
  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • Django Rest Framework 是否有第三方应用程序来自动生成 swagger.yaml 文件?

    我有大量的 API 端点编写在django rest framework并且不断增加和更新 如何创建和维护最新的 API 文档 我当前的版本是 Create swagger yaml文件并以某种方式在每次端点更改时自动生成 然后使用此文件作
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • Python 3d 绘图设置固定色阶

    我正在尝试绘制两个 3d 数组 第一个数组的 z 值在范围内 0 15 0 15 第二个来自 0 001 0 001 当我绘图时 色标自动遵循数据范围 如何设置自定义比例 我不想看到 0 001 的浅色 而应该看到 0 15 的浅色 如何修
  • 导入错误:没有名为flask.ext.login的模块

    我的flask login 模块有问题 我已经成功安装了flask login模块 另外 从命令提示符我可以轻松运行此脚本 不会出现错误 Python 2 7 r27 82525 Jul 4 2010 07 43 08 MSC v 1500
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • Django REST Framework - CurrentUserDefault 使用

    我正在尝试使用CurrentUserDefault一个序列化器的类 user serializers HiddenField default serializers CurrentUserDefault 文档说 为了使用它 请求 必须作为
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • 如果 PyPy 快 6.3 倍,为什么我不应该使用 PyPy 而不是 CPython?

    我已经听到很多关于PyPy http en wikipedia org wiki PyPy项目 他们声称它比现有技术快 6 3 倍CPython http en wikipedia org wiki CPython口译员开启他们的网站 ht
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • Firebase Firestore:获取文档的生成 ID (Python)

    我可以创建一个新文档 带有自动生成的 ID 并存储对其的引用 如下所示 my data key value doc ref db collection u campaigns add my data 我可以像这样访问数据本身 print d
  • 如何将 Django 中的权限添加到模型并使用 shell 进行测试

    我在模型中添加了 Meta 类并同步了数据库 然后在 shell 中创建了一个对象 它返回 false 所以我真的无法理解错误在哪里或者缺少什么是否在其他文件中可能存在某种配置 class Employer User Employer in
  • 在virtualenv中下载sqlite3

    我正在尝试使用命令创建应用程序python3 manage py startapp webapp但我收到一条错误消息 django core exceptions ImproperlyConfigured 加载时出错 pysqlite2 或
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是

随机推荐

  • 错误提示“.class 文件中的版本错误”

    我使用了JSP代码并在tomcat5 5服务器下执行了相同的操作 它工作被罚款 现在我已经将相同的代码复制到其他系统的tomcat服务器下 但是在提交该 jsp 文件时 收到以下错误 导致错误的原因可能是什么 请指教 root cause
  • 使 d3.js 可视化布局响应式的最佳方法是什么?

    假设我有一个直方图脚本 可以构建 960 500 svg 图形 我如何使其响应 以便调整图形宽度和高度是动态的
  • 如何快速学习Java RMI [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个 Java 应用程序 我已经开发了一两年了 我想创建一组非常简单的接口 以后可能会增加复杂性 我可以使用它从另一个 JVM 例
  • Jmeter - 如何向计数器添加前缀。类似于随机变量

    目前 在随机变量中 我可以在变量的输出格式中添加前缀或后缀 然而 这个很好的功能不适用于简单的计数器控制器 每次使用变量时连接 string counter 对我来说并不是一个好的选择 因为我经常这样做 有没有办法以随机变量的方式实现前缀
  • 对内置数据类型使用前向声明

    我明白 只要有可能 我们就应该使用前向声明而不是包含来加快编译速度 我有课Person像这样 pragma once include
  • 如何将 TWSocket 的 OnDataAvailable() 事件推送到 Delphi 6 应用程序中的后台线程?

    我有一个 Delphi 6 应用程序 它使用 ICS 组件套件进行套接字通信 我有自己的服务器套接字 VCL 组件 当新会话可用时 它会创建客户端 TWSocket 套接字 我创建的客户端套接字确实将 Multithreaded 属性设置为
  • 如何一起使用SparkSession和StreamingContext?

    我正在尝试从本地计算机 OSX 上的文件夹流式传输 CSV 文件 我将 SparkSession 和 StreamingContext 一起使用 如下所示 val sc SparkContext createSparkContext spa
  • 我应该使用哪些 Maven 工件来导入 PowerMock?

    我需要添加哪些罐子到我的pom xml让 PowerMock 与 Mockito 一起工作 我有以下依赖项
  • Google.Apis.Requests.RequestError 需要登录 [401] 消息[需要登录] 位置

    因此 我从 Nuget 下载了 Cloud Storage 的 NET 客户端 Google Apis Storage v1 版本 1 8 1 10 使用开发人员控制台创建了一个项目 生成了 API 密钥 启用了计费 创建了一个存储桶 但是
  • 如何绑定 ListBoxItem 的索引

    我想将列表框项目的 z 索引绑定到它们的索引 理想情况下 我们会有
  • Clojure、方面、Defprotocol、Defrecord

    defprotocol IAnimal IAnimal report o println type o reporting n inner report o println type o out n defrecord Dog IAnima
  • 如何将 JSON 转换为 CSV 格式并存储在变量中

    我有一个可以在浏览器中打开 JSON 数据的链接 但不幸的是我不知道如何阅读它 有没有办法使用 JavaScript 将这些数据转换为 CSV 格式并将其保存在 JavaScript 文件中 数据如下 count 2 items title
  • 纹理不绘制

    我想在屏幕上绘制图像 但我得到的是黑色方块 但上面没有纹理 图像路径正确并已加载 因为矩形具有正确的大小 我有一个单独的类用于加载名为 Texture 的纹理 还有一个用于绘制名为 Sprite 的纹理的类 这是代码 Class Textu
  • 如何向用户请求联系人访问权限,然后建立并打开联系人?

    好的 我联系了我的手机 除了两件事外 它运行得很好 首先 它第一次失败 因为它要求我访问联系人 我怎样才能使它在用户授予对联系人的访问权限后添加它 其次 有没有办法打开联系人 以便用户在建立后可以查看它 这就是我所做的 IBAction a
  • 使 Horizo​​ntalScrollView 的子级与屏幕一样大?

    我解决这个问题的方法是为子视图创建一个自定义视图 然后为自定义视图重写 onMeasure 新的 onMeasure 将宽度和高度设置为尽可能大 问题是当你显示软键盘时and旋转手机 随着方向的改变和键盘的显示 onMeasure 将 最大
  • 如何读取用户的单个字符?

    有没有一种方法可以从用户输入中读取单个字符 例如 他们在终端按下一个键 然后返回 有点像getch 我知道 Windows 中有一个功能 但我想要跨平台的功能 以下是 ActiveState Recipes 站点的链接 其中介绍了如何在 W
  • Hadoop/Hive Collect_list 不包含重复项

    根据该帖子 Hive 0 12 Collect list https stackoverflow com questions 6445339 collect set in hive keep duplicates 我试图找到 Java 代码
  • 项目在 Visual Studio 2010 解决方案中不可用

    我创建了下面的工具来使用我们的非 Microsoft 版本控制中的现有项目文件夹创建 VS2010 解决方案 当代码运行时 您告诉它您的代码位于哪个文件夹中 您的解决方案需要转到哪个文件夹 然后接受要在您选择的文件夹中创建的解决方案名称 它
  • Android - 应用程序已被拒绝,因为它主要面向儿童

    我在 Adob e Animate for Kids 中制作了一个应用程序 该应用程序第一次被接受 几天后我在我的应用程序中添加了 Admob 广告 除此之外没有任何更改 但现在我的应用程序不接受 Play 商店 并且第一个版本仍然在线 谁
  • Python 中的常见陷阱[重复]

    这个问题在这里已经有答案了 时隔多年 今天我再次被可变的默认参数所困扰 除非需要 我通常不会使用可变的默认参数 但我想随着时间的推移我忘记了这一点 今天在应用程序中 我在 PDF 生成函数的参数列表中添加了 tocElements 现在每次