在开始学习python之前,我已经开始学习一些Objective-C /
Cocoa书籍。我记得,大多数函数都需要明确说明关键字参数。直到最近,我都忘记了这一切,只是在Python中使用了位置参数。但是最近,我遇到了一些由于位置不当而导致的错误-
它们是偷偷摸摸的小东西。
让我思考-一般而言,除非有专门要求使用非关键字参数的情况-是否有充分的理由不使用关键字参数?即使对于简单功能也总是使用它们是否被认为是不好的风格?
我感觉就像我的大多数50行程序都定期扩展到500行或更多行一样,如果我习惯于始终使用关键字参数,随着代码的增长,代码将更易于阅读和维护。有什么原因可能不是这样吗?
更新:
我得到的总体印象是,它具有样式首选项,其中包含许多好的参数,通常不应将它们用于非常简单的参数,而应与好的样式保持一致。在接受之前,我只是想澄清-
这种方法是否会引起任何特定的非样式问题-例如,性能显着下降?
除了代码的清晰性和可读性之外,没有任何理由不使用关键字参数。是否使用关键字的选择应基于关键字在阅读代码时是否添加其他有用信息。
我遵循以下一般规则:
text.splitlines(True)
在代码中包含该变量)。funkyplot(x, y, None, None, None, None, None, None, 'red')
,看起来不太好)。sin(2*pi)
是不是更好sin(value=2*pi)
,同样是如此plot(x, y, z)
。在大多数情况下,稳定的强制性参数将为位置,而可选参数将为关键字。
在性能上也可能存在差异,因为在每种实现中,关键字参数都会稍慢一些,但是考虑到这通常是过早的优化,并且其结果并不重要,我认为这对决定并不重要。
更新:非风格的关注
关键字参数可以执行位置参数可以执行的所有操作,并且,如果要定义新的API,除了可能的性能问题之外,没有技术上的缺点。但是,如果将代码与现有元素结合在一起,则可能会遇到一些问题。
考虑以下:
cls.method(self=cls_instance)
即使self
定义中有一个参数也不起作用。如果您精心设计了API并记录了关键字参数的使用,那么所有这些都不是一个真正的问题,尤其是如果您不打算设计与现有的东西可以互换的东西时,尤其如此。
问题内容: 我是Python的新手,我正在尝试制作一个哈希表,该哈希表检查键是否指向表中的值,如果不是,则将其初始化为空数组。我的代码中令人反感的部分是这一行: 我得到错误: 但是在文档(以及各种示例代码)中,我可以看到它确实采用了默认参数: https://docs.python.org/2/library/stdtypes.html#dict.get http://www.tutorialsp
问题内容: 在某些示例BlackBerry Java类中,我已经看到以下代码: 我认为这是为了表现。按照标题,由于几乎没有(曾经?)有任何理由修改已经抛出的,它们应该总是吗? 如果是这样,编译器是否可以完成此操作?还是由编译器完成,手动添加完全没有影响? 问题答案: Java语言规范11.2.2在最终异常与非最终异常之间进行了区别: 如果throw语句(第14.18节)的抛出表达式具有静态类型E,
问题内容: 我遇到了-在我看来-奇怪的行为: 为什么str.split()不会接受关键字参数,即使这很有意义?我在Python2和Python3中都发现了这种现象。 问题答案: 见这个bug和它的superseder。 是CPython中的本机函数,因此具有此处描述的行为: CPython实现细节: 一个实现可能会提供内置函数,这些函数的位置参数没有名称,即使出于文档目的而对其进行了“命名”,因此
问题内容: 我指的是模块中的OrderedDict,这是一个有序的字典。 如果它具有可订购的附加功能,我意识到这通常不是必需的,但是即使如此,是否还有缺点?慢一点吗?是否缺少任何功能?我没有看到任何丢失的方法。 简而言之,为什么我 不 总是使用它而不是普通的词典? 问题答案: 是的子类,并且需要更多内存来跟踪键的添加顺序。这不是小事。该实现在幕后增加了第二个,所有键的双向链接列表(这是记住顺序的部
问题内容: 今天的工作中,我遇到了volatileJava中的关键字。不太熟悉,我找到了这种解释。 鉴于该文章详细解释了所讨论的关键字,您是否曾经使用过它,或者是否曾见过可以正确使用此关键字的情况? 问题答案: volatile具有内存可见性的语义。基本上,volatile字段的值对所有读取器(尤其是其他线程)可见,在该字段上完成写操作之后。没有volatile,读者可能会看到一些未更新的值。 要
版本: 返回一个,其ID为“z”,偏移量为0,默认区域规则。 返回一个,包含ID“utc”和。 例如,在处理时。在这里,我能发现的唯一区别是它的打印方式不同。 我们正在来回地进行代码审查讨论,所以我想这种冲突并不罕见。 它是一个常量(此外,它的偏移量值(0)甚至被缓存)。 由于缺少区域信息,它的开销少了一点。 在UTC时,不需要考虑夏时制时间或历史变化,就像在任何其他时区一样。 因此,对于我迄今为
问题内容: 我正在网上关注Java教程,尝试学习该语言,并且它在使用数组的两种语义之间反弹。 和: 该教程从未真正提到过为什么它会在两者之间来回切换,所以我对该主题进行了一些搜索。我目前的理解是,操作员正在创建“ longs数组”类型的对象。我 不 明白的是为什么我要那个,那有什么后果? 是否存在某些特定于“数组”的方法,除非它是“数组对象”,否则这些方法对数组不起作用? 有什么我 不能 用普通数
问题内容: 怎么办?例如在函数中: 问题答案: 如果使用(或-ea简称)启动程序,则此语句 相当于 如果不使用此选项启动程序,则assert语句将无效。 例如,;在你的问题中发布的,等同于 (如果你启动的是。) Java语言规范assert正式为:14.10。该声明说: 14.10。的声明 的断言是一个含有一个布尔表达式语句。断言是启用还是禁用。如果启用了断言,则断言的执行将导致对布尔表达式进行求