Python名称重整功能 [英] Python name mangling function

查看:104
本文介绍了Python名称重整功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆