Python建议:内省函数调用的可移植性


14

在Python中,您可以dir在任何对象上使用该函数来获取其实例函数名称的列表:

>>> dir('abc')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__','__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

我想知道这是否可以在程序中比调用几个冗长命名的函数有用的高尔夫技巧。在这种情况下,我可以创建一个函数选择函数F

F=lambda o,i:eval('o.'+dir(o)[i])

现在假设我有一个字符串s,我想将首字母大写的结果存储在变量中c。然后而不是c=s.capitalize(),我可以注意到它capitalize在上面列表中的位置33并执行以下操作:

s='abc'
c=G(s,33)()

分配'Abc'c

我的问题是,这在大多数情况下是否可行。尤其是,

  • 我是否总可以指望按ASCII值按字典顺​​序排序的列表?
  • 次要版本之间的可用列表是否有很多更改?
  • 实现之间是否存在差异?

另外,有人在PPCG上使用过此功能吗?


我已经看到使用JavaScript和C#完成类似的操作。
彼得·泰勒

2
您还可以使用内建做到这一点:dir(__builtins__)。这是一个替代函数:F=lambda o,i:getattr(o,dir(o)[i])
grc 2014年

还要注意,根据您打算使用的功能,可以像这样()在末尾添加FF=lambda o,i:eval('o.'+dir(o)[i])()然后c=F('abc',33)将'Abc'分配给c
FryAmTheEggman 2014年

Answers:


6

文档中

结果列表按字母顺序排序

至于差异,我认为您必须进行检查(并且在答案中指定可能是一个好主意)。python 2和3之间有明显的区别,例如,__nonzero__被重命名为__bool__

我从来没有听说过实现之间的任何区别,但是我找不到关于它的任何引用。

我不认为这是以前使用过的部分原因,因为这样做很少会节省您任何字符:

F=str.capitalize
s='abc'
c=F(s)

dir()为了使之物有所值,您将需要使用多种不同的功能。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.