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





5.00/5 (2投票s)
这是一个 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
变量名必须以英文字母开头。变量名的其余部分可以包含英文字母、数字或下划线字符'_'。
如果 string
的 initial_value
包含空格字符,则初始值必须用双引号括起来。
布尔参数唯一有效的默认值是 False
和 True
。
关于 parameter_type
parameter_type
说明符可以是以下字符之一。如果未为这些类型中的任何一个指定 initial_value
,则使用指定的初始值默认值。
s
或str
- 字符串参数,默认为空字符串 ''。i
或int
- 整数参数,默认为0
。f
或float
- 浮点数参数,默认为0.0
。b
或bool
- 布尔参数,默认为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
变量默认值的错误