Python 德米特定律与巨蟒

Python 德米特定律与巨蟒,python,Python,有没有工具可以检查Python代码是否符合德米特定律 我发现pychecker中提到了Demeter,但该工具对该定律的理解似乎与我的预期不同: 维基百科的定义:函数的德米特定律要求对象O的方法M只能调用以下类型对象的方法: O本身 M参数 在M中创建/实例化的任何对象 O的直接组件对象 一个全局变量,可由O访问,在M的范围内 在您提供的链接中解释这条法律的方式过于模糊和主观,任何自动工具都无法有效地检查。您需要考虑一些具体的规则,这些规则会导致遵守该法律的代码。然后你可以检查这些规则 德米特定

有没有工具可以检查Python代码是否符合德米特定律

我发现pychecker中提到了Demeter,但该工具对该定律的理解似乎与我的预期不同:

维基百科的定义:函数的德米特定律要求对象O的方法M只能调用以下类型对象的方法:

  • O本身
  • M参数
  • 在M中创建/实例化的任何对象
  • O的直接组件对象
  • 一个全局变量,可由O访问,在M的范围内

  • 在您提供的链接中解释这条法律的方式过于模糊和主观,任何自动工具都无法有效地检查。您需要考虑一些具体的规则,这些规则会导致遵守该法律的代码。然后你可以检查这些规则

    德米特定律。。。对象O的方法M只能调用以下类型对象的方法:

  • O自身——即
    self
    变量。很容易看到
  • M的参数——即参数给出的局部变量。也就是说,在
    locals()中
  • 在M中创建/实例化的任何对象——即局部变量。也就是说,在
    locals()中
  • O的直接组件对象——即
    self
    变量
  • 一个全局变量,可由O访问,在M范围内——即
    global
    语句中命名的变量或对本地命名空间中找不到的全局变量的隐式引用。也就是说在
    globals()
  • 嗯。。。。函数没有其他可访问的变量,是吗?由于名称空间的工作方式,我认为没有任何可能违反这项法律

    您是否有一个Python代码违反这些规则之一的示例


    您将如何访问另一个命名空间?

    您可能会这样违反该法律:

    class SomeClass:
        def someMethod(self):
            self.getSomeOtherClass().someOtherMethod() # this breaks the law
        def getSomeOtherClass(self):
            class_ = SomeOtherClass()
            return class_
    

    或否?

    我怀疑任何自动工具都无法(可靠地)检查此类设计原则。这个定义对人类来说很好,但你能向计算机解释一下吗?很可能不是,因为许多部分(谁是朋友或陌生人,“密切相关”,多少知识太多,…)都需要解释。def someMethod()://o=self.GetSomeObject()//x=o.someMethod()//o不是在someMethod中实例化的,而是从一些function@user327725:这不是第三条规则吗。在
    M
    中创建/实例化的任何对象?它怎么不是规则3?不,它不是规则3,因为对象不是在“someMethod”中创建的,而是在“GetSomeObejct”中创建的。不,因为在
    globals()
    中可以使用其他类。没必要这么复杂,我想你已经知道了。如果另一个类是通过
    execfile
    引入的,那显然是违法的。这是一个在源代码中甚至不可见的对象。不同意。您需要考虑在Python中打破这些规则的具体方法。然后想办法找出这个。我不认为打破这些规则很容易。我每天都看到规则被打破。这就是:param.get_something().get_something_other().do_stuff()。除非使用流畅的界面,否则使用的点数是违反“德米特定律”的良好指标。