Python名称重整功能 [英] Python name mangling function
问题描述
Python标准库中是否有一个函数可以使用私有"属性名称重现Python的名称处理方案?似乎会有,但我终生找不到.
Is there a function in the Python standard library to reproduce Python's name mangling scheme with a "private" attribute name? It seems like there would be, but I can't find it for the life of me.
我写了这个,但是如果有更好的方法,我会全神贯注.
I wrote this, but if there's a better way I'm all ears.
def mangle_name (cls, attrname) :
prefix = '_' + cls.__name__.lstrip('_')
if not attrname.startswith('__') :
attrname = '__' + attrname
if not attrname.endswith('__') :
return prefix + attrname
else :
return attrname
class Foo :
__some_such = 3
name = mangle_name(Foo, '__some_such')
print name
print hasattr(Foo(), name)
推荐答案
编译器模块具有一个Python实现,签名是mangle(name, klass)
,其中klass
是类名,而不是对象本身.
It looks like the compiler module has a Python implementation for this, the signature is mangle(name, klass)
where klass
is the class name, not the object itself.
以下是您可以访问和使用它的方式:
Here is how you can access and use it:
>>> from compiler.misc import mangle
>>> mangle('__some_such', 'Foo')
'_Foo__some_such'
请注意,自Python 2.6起不推荐使用编译器模块,并且在Python 3.0中不存在.
Note that the compiler module is deprecated since Python 2.6 and does not exist in Python 3.0.
函数本身(来自 Python 2.7源代码 ),以防您只想将其复制到源中或验证您的版本是否相同:
Here is the function itself (from Python 2.7 source code) in case you just want to copy it into your source or verify that your version is equivalent:
MANGLE_LEN = 256 # magic constant from compile.c
def mangle(name, klass):
if not name.startswith('__'):
return name
if len(name) + 2 >= MANGLE_LEN:
return name
if name.endswith('__'):
return name
try:
i = 0
while klass[i] == '_':
i = i + 1
except IndexError:
return name
klass = klass[i:]
tlen = len(klass) + len(name)
if tlen > MANGLE_LEN:
klass = klass[:MANGLE_LEN-tlen]
return "_%s%s" % (klass, name)
这篇关于Python名称重整功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!