- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
最近,我在网上看到一些关于 Python 中如何没有好的“switch/case”等价物的讨论。我意识到有几种方法可以做类似的事情——一些使用 lambda,一些使用字典。还有其他关于替代方案的 StackOverflow 讨论。甚至有两个 PEP(PEP 0275 和 PEP 3103)讨论(并拒绝)将 switch/case 集成到语言中。
我想到了一种我认为是处理 switch/case 的优雅方式。
最终看起来像这样:
from switch_case import switch, case # note the import style
x = 42
switch(x) # note the switch statement
if case(1): # note the case statement
print(1)
if case(2):
print(2)
if case(): # note the case with no args
print("Some number besides 1 or 2")
所以,我的问题是:这是一个有值(value)的创作吗?您有什么改进建议吗?
我把 include file on github ,以及广泛的例子。 (我认为整个包含文件大约有 50 行可执行文件,但我有 1500 行示例和文档。)我是否过度设计了这个东西,浪费了很多时间,或者有人会觉得这值得吗?
编辑:
试图解释为什么这与其他方法不同:
1)多条路径是可能的(执行两种或多种情况), 这在字典方法中更难。
2) 可以检查除“等于”以外的比较 (例如大小写(小于(1000))。
3) 比字典方法更具可读性,可能还有if/elif方法
4) 可以跟踪有多少真实案例。
5) 可以限制允许的 True 案例数。 (即执行 前 2 个真实案例……)
6) 允许默认情况。
这是一个更详细的例子:
from switch_case import switch, case, between
x=12
switch(x, limit=1) # only execute the FIRST True case
if case(between(10,100)): # note the "between" case Function
print ("%d has two digits."%x)
if case(*range(0,100,2)): # note that this is an if, not an elif!
print ("%d is even."%x) # doesn't get executed for 2 digit numbers,
# because limit is 1; previous case was True.
if case():
print ("Nothing interesting to say about %d"%x)
# Running this program produces this output:
12 has two digits.
这里有一个例子试图展示 switch_case 如何比传统的 if/else 更清晰和简洁:
# conventional if/elif/else:
if (status_code == 2 or status_code == 4 or (11 <= status_code < 20)
or status_code==32):
[block of code]
elif status_code == 25 or status_code == 45:
[block of code]
if status_code <= 100:
[block can get executed in addition to above blocks]
# switch_case alternative (assumes import already)
switch(status_code)
if case (2, 4, between(11,20), 32): # significantly shorter!
[block of code]
elif case(25, 45):
[block of code]
if case(le(100)):
[block can get executed in addition to above blocks]
最大的节省是长 if 语句,其中一遍又一遍地重复相同的开关。不确定用例的频率,但似乎在某些情况下这是有意义的。
github 上的示例文件有更多示例。
最佳答案
So, my questions are: Is this a worthwhile creation?
没有。
Do you have any suggestions for making it better?
是的。不要打扰。它拯救了什么?严重地?实际上,通过从每个 elif
条件中删除变量 x
,您实际上使代码变得更加模糊。此外,通过替换明显的 elif
和 if
你故意让所有 Python 程序员感到困惑,他们现在认为这些情况是独立的。
这会造成混淆。
The big savings is in long if statements where the same switch is repeated over and over. Not sure how frequent of a use-case that is, but there seems to be certain cases where this makes sense.
没有。这是非常罕见的,非常做作并且很难阅读。查看涉及的实际变量是必不可少的。省略变量名故意使事情变得困惑。现在我必须找到所属的 switch()
函数来解释 case
。
当有两个或更多变量时,这完全崩溃了。
关于python - Python 中的 Switch/Case 实现有什么值(value)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5440990/
我经常在 ATS 中看到使用 case、case+ 或 case- 形成的 case 表达式。有什么区别? 最佳答案 如果表达式不详尽,使用 case 会发出警告,case+ 会产生错误,而 case
我有一个导入时全部大写的表,我想将其转换为正确的大小写。你们用什么脚本来完成这个? 最佳答案 这个函数: “正确大小写”由空格分隔的所有“大写”单词 保留“小写单词” 即使对于非英语字母也能正常工作
#include int main() { switch(2) { case 1: if(1)
我已经四处寻找了一段时间,如果我使用的术语不当,请原谅我... 代码的目标是在输入为 0 时更新 Aout1 和 Aout0,输出对应于 7 段显示,但出现以下错误: “错误 (10170):Four
我正在尝试按照 PostgreSQL 手册中的说明进行操作。 PostgreSQL: Documentation: 9.1: Control Structures 我的 PostgreSQL 服务器是
我有一个状态机,其中有几个非常相似的状态。我可以为每个状态编写它,如下例所示: module CHECK_FSM ( GO, DONE, CLK, RESETN ); input GO;
如何使用或创建案例? 就像是: string str; case (str) "abc" || "dfg": begin //some code end "yfg":
这个问题已经有答案了: Are double and single quotes interchangeable in JavaScript? (23 个回答) 已关闭 9 年前。 我正在学习Java
汽车 Make | Model | Year | Color Honda | Accord | 12 | Red Lexus | IS | 14 |
如何使用当前 case 语句的值跳转到 switch-case 条件下的另一个 case 语句? 是否可以使用 switch case 来实现这种事情,或者是否有其他实现方式? 有可能实现吗?如果没有
我理解下面的代码。 var day = 2; switch (day) { case 1: document.write("Monday"); break;
这是有效的。 object FilesToDFDS { case class Student(id: Int, name: String, dept:String) def main(
我对 VHDL 还是个新手。我需要在 CASE 语句中为多个信号赋值,如下所示: CASE input24 IS WHEN "00" THEN output0
我有这个 case 语句,它给出了一个错误“变量 constant1 未使用”。它似乎忽略了变量并返回了第一行,因此变量显然没有范围。如果我用数字 1 替换常量,那么它就可以工作。在 Elixir 中
在 MySQL 中,是否可以在 SELECT 子句中有两个 CASE 语句,其中第二个 CASE 语句依赖于第一个 CASE 语句? 例如,考虑以下查询: SELECT CASE WHEN `user
我正在尝试一个挑战,我需要获得一个随机数,并在没有重复的情况下打印数字内的数字总和:例如,123 将打印 6 ( 1 + 2 + 3 ),而 32111 将做同样的事情(因为我们没有在我们的总和中添加
当有人试图更新当前未存储在我的散列中的值时,我想立即返回 when 'add' 而无需重新启动整个 case声明,因为我已经知道他们想要添加并且不想再次提示他们。 有没有一种方法可以在不重新启动整个案
老 C 程序员可以在 Swift 方面得到一些帮助。 我不太了解 if-case 语法。例如: if case 20...30 = age { print ("in range.") } cas
老 C 程序员可以在 Swift 方面得到一些帮助。 我不太了解 if-case 语法。例如: if case 20...30 = age { print ("in range.") } cas
我有一个 ArrayList,其中包含以下字符串:[name, age, gender, salary] . 有没有办法可以将 ArrayList 中的值用作 case 表达式? 显而易见的答案是否定
我是一名优秀的程序员,十分优秀!