iptfile = args和args [0]或“Python / graminit.c”

时间:2018-06-07 00:43:04

标签: python

我在阅读cpython/keyword.py

时遇到以下代码
def main():
    import sys, re

    args = sys.argv[1:]
    iptfile = args and args[0] or "Python/graminit.c"
    if len(args) > 1: optfile = args[1]
    else: optfile = "Lib/keyword.py"

iptfile = args and args[0] or "Python/graminit.c"是什么意思?
我能理解iptfile = args or "Python/graminit.c"

此外,如果我遵循此惯例,模块将在main()内导入而不是位于顶部?

1 个答案:

答案 0 :(得分:1)

这个文件几乎是一种quine来生成kwlist。它需要两个可选输入,语法和模板,并更新kwlist列表。默认情况下,它自己编写!

解决您的具体意见

iptfile = args and args[0] or "Python/graminit.c"

这是一个穷人的ternary表达。如果args是真实的:iptfile = args[0],否则iptfile = "Python/graminit.c" - 或许更具可读性的形式

iptfile = args[0] if args else "Python/graminit.c"

虽然如果你看一下引入这段代码的the commit,它甚至会在语言中使用该语法(1997-03-20)!

导入作为一种性能黑客位于函数内部。除了在构建时,生成关键字列表文件的代码几乎从不执行,因此在关键路径中避免了导入(可能代价高昂)。通常这种样式不是必需的,在文件顶部导入就好了(通常更容易维护/协作)。