Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用命令行中的排序键_Python - Fatal编程技术网

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您能否澄清您试图接受哪些字符串作为排序键?