Python 使用命令行中的排序键
我需要允许用户从命令行定义排序键,类似Python 使用命令行中的排序键,python,Python,我需要允许用户从命令行定义排序键,类似 sort(key=commandLineArg) 但是,commandLineArg是一个字符串,不可调用。如何实现此功能?您可以计算给定字符串以获得可调用的: In [27]: eval('lambda x: x**2')(3) Out[27]: 9 但是,只有当你真正信任用户时,才能这样做 您可以对给定字符串求值以获得可调用字符串: In [27]: eval('lambda x: x**2')(3) Out[27]: 9 但是,只有当你真正信任
sort(key=commandLineArg)
但是,
commandLineArg
是一个字符串,不可调用。如何实现此功能?您可以计算给定字符串以获得可调用的:
In [27]: eval('lambda x: x**2')(3)
Out[27]: 9
但是,只有当你真正信任用户时,才能这样做 您可以对给定字符串求值以获得可调用字符串:
In [27]: eval('lambda x: x**2')(3)
Out[27]: 9
但是,只有当你真正信任用户时,才能这样做 您可以使用:
要对对象的属性进行排序,当属性名称仅为字符串时。可以使用:
要对对象的属性进行排序,当属性名称仅为字符串时。您可以将
str.lower
作为命令行参数给出示例。虽然可以使用eval
将这样的字符串转换为Python对象,但这是有风险的,我可能会建议在这方面再做一步。例如:
SortKeys = {
"capitalize": str.capitalize,
"lower": str.lower,
"title": str.title,
"upper": str.upper,
}
if sys.argv[1] in SortKeys:
sort(..., key=SortKeys[sys.argv[1]])
else:
print("Unknown sort key:", sys.argv[1])
这种方法将允许您更好地控制排序键的可能类型,而不允许执行任意代码。您将
str.lower
作为命令行参数给出示例。虽然可以使用eval
将这样的字符串转换为Python对象,但这是有风险的,我可能会建议在这方面再做一步。例如:
SortKeys = {
"capitalize": str.capitalize,
"lower": str.lower,
"title": str.title,
"upper": str.upper,
}
if sys.argv[1] in SortKeys:
sort(..., key=SortKeys[sys.argv[1]])
else:
print("Unknown sort key:", sys.argv[1])
这种方法将允许您更好地控制排序键的可能类型,而不允许执行任意代码。您希望此命令行参数包含什么?全局函数的名称?一节课?任意Python代码?请提供命令行参数实际外观的示例。命令行参数类似于str.lower。因此,调用本质上是sort(key=“str.lower”)。这对字符串不起作用,但如果只是排序(key=str.lower)就可以了@JoshBrittain:请用新的事实更新这个问题。请关注命令行参数示例。请不要在问题中添加评论。请尽可能清楚完整地回答这个问题。对于命令行应用程序来说,所有这些()都不是一个好主意。这个神秘的“commandLineArg”将采用什么——特定的——格式?您打算让这个命令行参数包含什么?全局函数的名称?一节课?任意Python代码?请提供命令行参数实际外观的示例。命令行参数类似于str.lower。因此,调用本质上是sort(key=“str.lower”)。这对字符串不起作用,但如果只是排序(key=str.lower)就可以了@JoshBrittain:请用新的事实更新这个问题。请关注命令行参数示例。请不要在问题中添加评论。请尽可能清楚完整地回答这个问题。对于命令行应用程序来说,所有这些()都不是一个好主意。这个神秘的“commandLineArg”将采用什么——具体的——格式?我尝试了排序(key=operator.itemgetter(“str.lower”))我得到了一个字符串索引必须是整数,而不是str error你能澄清一下你试图接受哪些字符串作为排序键吗?我尝试了排序(key=operator.itemgetter(“str.lower”))我得到了一个字符串索引必须是整数,不是str error您能否澄清您试图接受哪些字符串作为排序键?