65.9K
CodeProject 正在变化。 阅读更多。
Home

用 Python 3 编写的 Python 3 代码生成器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2022年11月10日

MIT

5分钟阅读

viewsIcon

5106

downloadIcon

170

这是一个 Python 3.x 代码生成程序,用于生成 Python 3 程序。

引言

此程序生成 Python 3 程序,用于解析命令行参数并显示输入值。此程序的目的是允许快速创建 Python 3 程序的解析代码和帮助文本。

如果我更新此程序,我会再次上传并更改版本号,目前是 1.1.1。

背景

这是我几年前写的 Python 2 版本的重大改进程序,可以在以下网址找到:

我基本上已经停止使用 Python 2,现在只编写 Python 3 代码。这个新程序比我旧程序具有更多的错误检查和用户输入验证功能。

Using the Code

用法

python create_python_prog.py <program_name> [parameter 1] [parameter 2} ... [parameter N]

python create_python_prog.py [-h | --help]

关于 create_python_prog.py

此程序生成 Python 3 程序,用于解析命令行参数并显示输入值。此程序的目的是允许快速创建 Python 3 程序的解析代码和帮助文本。

传递给此程序的参数指定了生成程序的名称以及生成程序参数的创建。

每个参数是以逗号分隔的列表,形式为:

<variable_name[=initial_value]>[,parameter_type][,parameter_count_token]
[,-one_char_switch][,--long_switch]

变量名是必需的,并且必须放在第一个。可选的 parameter_type、可选的 parameter_count_token 和可选的 parameter_switch(或开关)可以按任意顺序排列。

只需要变量名。所有其他项都是可选的。

参数开关必须以一个或两个连字符('-')字符开头。初始值只能为可选参数指定。可选参数包括开关参数和 parameter_count_token 等于 '?' 或 '*' 的位置参数。

关于 variable_name

变量名必须以英文字母开头。变量名的其余部分可以包含英文字母、数字或下划线字符'_'。

如果 stringinitial_value 包含空格字符,则初始值必须用双引号括起来。

布尔参数唯一有效的默认值是 FalseTrue

关于 parameter_type

parameter_type 说明符可以是以下字符之一。如果未为这些类型中的任何一个指定 initial_value,则使用指定的初始值默认值。

  • sstr - 字符串参数,默认为空字符串 ''。
  • iint - 整数参数,默认为 0
  • ffloat - 浮点数参数,默认为 0.0
  • bbool - 布尔参数,默认为 False。布尔参数必须是可选参数,即通过以连字符开头的开关控制的参数。

如果未指定 parameter_type,则 parameter_type 默认为 string 参数。

关于 parameter_count_token

可选的计数标记控制为指定参数类型接受的参数数量。如果数量大于一,则由给定名称指定的变量将是一个 Python 列表。此最终可选计数参数用作参数解析器代码中的 'nargs'。nargs 参数通常是以下之一:

  • * - 接受 0 个或多个参数类型
  • + - 接受 1 个或多个参数类型
  • ? - 参数是可选的
  • [大于零的正整数] - 接受指定数量的参数,例如 2

如果未指定 parameter_count_token,则在运行时,该参数在命令行上只输入一个值。如果 parameter_count_token 指示多个值,则 variable_name 将标识一个 Python 列表实例,并且输入的每个值将由生成的解析代码添加到列表中。

关于 parameter_switches

初始连字符表示 parameter_switch。单个连字符表示单字符开关名称。两个初始连字符表示长名称开关。

可以同时指定短名称开关和长名称开关。

-h--help 开关会自动实现,不应将其指定为 switch 参数。运行生成的程序时,使用任一帮助开关将输出生成的程序开头的 __doc__ string

关于布尔参数的附加信息

布尔参数,其 parameter_type 为 'b' 或 'bool',只能是可选的 switch 参数。在生成的程序中使用布尔参数的 switch 会将布尔参数的变量名设置为与 initial_value 相反的值。如果未指定初始值,则布尔参数的默认值为 False

命令示例

python create_python_prog.py foo alpha,i beta,f,+ file_name gamma,b,-g,--gma

此命令行生成一个名为 'foo.py' 的程序,该程序接受一个名为 'alpha' 的整数参数,一个或多个名为 'beta' 的浮点数参数列表,然后是一个名为 file_name 的字符串参数,最后是一个名为 'gamma' 的可选参数,该参数是一个布尔值,仅当指定了 '-g' 开关或 '--gma' 开关时才为 'True'。

python create_python_prog.py foo file_name='bar.txt',?

命令行中的 ? 字符使 file_name 参数成为可选参数。如果未指定参数,则变量 'file_name' 被设置为 'bar.txt'。

附录

生成的代码使用 Python 的参数解析器模块。要添加参数,会使用 'Add_argument' 方法。不会使用 'Add_mutually_exclusive_group' 和 'Subparsers' 方法。如果需要,修改生成的代码以使用这些附加方法相对容易。

以下是使用以下命令创建的示例生成程序:

python create_python_prog.py foo.py text_desc amount,i value=0.5,f,? maxval,
f,-m,--max display_flag,b,-d,--disp

这是生成的 Python 3 程序。

#!/usr/bin/env python
"""
    python foo.py <text_desc> <amount> [value] [-m <maxval> | --max <maxval>]
                  [-d <display_flag> | --disp <display_flag>]

    python foo.py [-h | --help]

    TODO: Add usage information here.
"""
import sys
# TODO: Uncomment or add imports here.
#import os
#import re
#import time
#import urllib
#import subprocess
from argparse import ArgumentParser

def foo_main(text_desc, amount, value, maxval, display_flag):
    """ TODO: Add docstring here. """
    # TODO: Add or delete code here.
    # Dump all passed argument values.
    print(f"{text_desc=}")
    print(f"{amount=}")
    print(f"{value=}")
    print(f"{maxval=}")
    print(f"{display_flag=}")
    return 0

# Start of main program.
def main(argv=None):
    # Initialize the command line parser.
    parser = ArgumentParser(description='TODO: Text to display before the argument help.',
                            epilog=f'Copyright (c) 2022 TODO: your-name-here.',
                            add_help=True,
                            argument_default=None, # Global argument default
                            usage=__doc__)
    parser.add_argument(action='store', dest='text_desc', \
                        help='A string value that TODO:')
    parser.add_argument(action='store', dest='amount', \
                        type=int, help='A integer value that TODO:')
    parser.add_argument(action='store', dest='value', \
    type=float, default=0.5, nargs='?', help='A floating point value that TODO:')
    parser.add_argument('-m', '--max', action='store', dest='maxval', \
    type=float, default=0.0, help='A floating point value that TODO:')
    parser.add_argument('-d', '--disp', action='store_true', \
    dest='display_flag', default=False, help='A Boolean value that TODO:')
    # Parse the command line.
    arguments = parser.parse_args(args=argv)
    text_desc = arguments.text_desc
    amount = arguments.amount
    value = arguments.value
    maxval = arguments.maxval
    display_flag = arguments.display_flag
    status = 0
    try:
        foo_main(text_desc, amount, value, maxval, display_flag)
    except ValueError as value_error:
        print(value_error)
        status = -1
    except OSError as os_error:
        print(os_error)
        status = -1
    except MemoryError as mem_error:
        print(mem_error)
        status = -1
    return status

if __name__ == "__main__":
    sys.exit(main())

这是上面显示的生成程序的帮助输出

python foo.py -h
usage:
python foo.py <text_desc> <amount> [value] [-m <maxval> | --max <maxval>]
[-d <display_flag> | --disp <display_flag>]

 python foo.py [-h | --help]

 TODO: Add usage information here.

 TODO: Text to display before the argument help.

positional arguments:
text_desc     A string value that TODO:
amount        A integer value that TODO:
value         A floating point value that TODO: 

options:
-h, --help    show this help message and exit
-m MAXVAL, --max MAXVAL A floating point value that TODO:
-d, --disp   A Boolean value that TODO:

Copyright (c) 2022 TODO: your-name-here.

关注点

通常需要打印变量名和值,例如:

some_variable='variable_value'

Python 3.8 及更高版本通过添加等号('=')使此操作非常容易,即在变量名后添加 '='。
上面的输出是用以下行打印的。这适用于字符串、整数、浮点数和布尔变量。

print(f"{some_variable=}")

如果您使用的 Python 版本早于 3.8,则上面的行必须更改为:

print(f"some_variable={some_variable}")

我认为这是较早版本的 Python 3.x 必须更改的唯一功能。

历史

  • 首次上传 - 版本 1.1
  • 上传版本 1.1.1 - 修复了可选 string 变量默认值的错误
© . All rights reserved.