背景
(可能与此相关,因为可能有一种更简单的方法来实现我想要的。)
我想要构建一种声明式的方法来定义可以通过静态代码分析工具来分析的“方面”。整个概念都写下来了,这里。每个方面(比如Redundancy)都可能递归地有子方面(比如Redundancy.Clone),每个方面都应该有文档和任意的其他属性。用户应该能够选择要分析的方面,如果是用户选择的方面(即对于给定的类Redundancy.Clone,我想验证它是否属于给定的字符串redundancy.clone,而不是redundancy.unused_import),则必须以编程方式查找该方面的内部表示形式。
我决定用这样的课程:
class Redundancy(Aspect):
"""
This meta aspect describes any kind of redundancy in your source code.
"""
# Can't inherit from Redundancy here because of the recursion
class Clone(Aspect):
"""
This redundancy describes a code clone. Code clones are different pieces of
code in your codebase that are very similar.
"""
# Stuff...问题
对于给定的Aspect类,我希望获得描述字符串(Redundancy.Clone -> redundancy.clone)。为此,我必须获取周围模块/类的名称/不管它是什么,检查它是否是一个类(琐碎的),并从其中构造一个字符串。
可能的解决方案及其失败的原因
我确实试着查看类的dir,看看在did方法中是否有什么有用的东西,但是除了repr之外,什么都找不到,在上面的例子中,repr是在aspects模块中使用时的<class 'coalib.bearlib.aspects.Redundancy.Clone'>。这表明这是可能的,但我不知道repr是如何获得这些信息的,我希望避免使用repr,并删除不必要的内容,因为这是一种黑客行为。
我无法从外部继承嵌套类,因为它还没有完全定义。我希望它们嵌套在可用性上,能够使用from ... import Redundancy,在我的源代码中编写Redundancy.Clone是一个巨大的优势。
如有任何建议,包括改变我的做法,将不胜感激。
发布于 2016-10-21 10:23:49
您可以使用__qualname__ (佩普3155)
>>> class C:
... def f(): pass
... class D:
... def g(): pass
...
>>> C.__qualname__
'C'
>>> C.f.__qualname__
'C.f'
>>> C.D.__qualname__
'C.D'
>>> C.D.g.__qualname__
'C.D.g'发布于 2016-10-21 10:30:33
您可以在class Redundancy语句使用类型类完成其执行之后构造该类。例如:
class Aspect:
pass
class Redundancy(Aspect):
@classmethod
def init(cls):
cls.make_Clone()
@classmethod
def make_Clone(cls):
def __init__(self):
print('inside Redundancy.Clone')
methods = {}
methods["__init__"] = __init__
cls.Clone = type("{0}.Clone".format(cls.__name__), (Redundancy,), methods )
Redundancy.init()
print(Redundancy.Clone)
print(Redundancy.Clone())
# output:
# <class '__main__.Redundancy.Clone'>
# inside Redundancy.Clone
# <__main__.Redundancy.Clone object at 0x01DCA130>https://stackoverflow.com/questions/40173362
复制相似问题