如何避免长类定义中的“不必要”缩进?

2024-04-26 23:22:45 发布

您现在位置:Python中文网/ 问答频道 /正文

Perl和C++中的P> 我们可以通过定义 方法,从而避免额外的 缩进。你知道吗

当然那些语言是 自由形式(与Python相反),因此不需要严格地为每个 嵌套级别,但通常这样做是为了可读性。你知道吗

例如,在C++中,下面的类定义(方法1):

class X {
    void x_method(int a, int b) {
        // implementation details follows here.. Note: extra indentation
    }
};

也可以用类外的方法定义编写(方法#2):

class X { 
    void x_method(int a, int b);
};
void X::x_method(int a, int b) {
    // implementation details follows here
}

在Perl中,您可以将第一个版本编写为:

package X {
    sub x_method {
        my ($a, $b) = @_;
        # implementation details follows here
    }
}

使用此样式可以避免方法定义的额外缩进:

package X; 
sub x_method {
    my ($a, $b) = @_;
    # implementation details follows here
}
package Y; # marks the start of another class
# ...

在这些 例如,我使用了一个小类定义,它的扩展比 可以在计算机屏幕上查看的行数(例如 少于50行)。对于此类定义,方法1 在班里很好。但是,一旦类定义 数百行,我更喜欢通过定义类来实现#2 类外的方法。你知道吗

但是,我在Python中找不到这种方法。我该怎么做 #Python中的2?你知道吗

在我看来 在Python中只有方法1:

class X:
    def x_method(a, b):
         //implementation details follows here

我想要类似的方法(方法2):

class X:  
def x_method(a, b):
    # implementation details..

class Y:  # marks the start of another class
# ...

当类定义中的方法(和行)数 随着时间的推移,我认为appraoch#1变得越来越冗长。 那么,我能看到额外的空间(缩进)的唯一用途是 表示方法属于给定的类X。 而这些信息(一个方法属于一个给定的类)并不存在 需要像类一样在越来越多的行上扩展和传播 定义增长。把这些信息包含在 在Perl中是单行的(使用package语句),或者是一个前缀词 在C++中使用命名空间前缀运算符的方法 名称在其定义的第一行。你知道吗

我对Python不太熟悉,而且来自其他语言 感觉我在多余的空间里窒息(使用方法#1) 对于大型类定义,它会分散我编程的注意力 任务。我错过了什么?你知道吗

额外的缩进也会迫使你打断更多的线以保持在内部 建议每行限制80个字符。你知道吗


Tags: 方法语言packagehere定义my空间details
2条回答

在python中不能有方法#1,因为除了类之外,还可能有顶级函数定义,所以python将无法确定下面示例中的global_function是真正全局的还是属于类X

class X:  
def x_method(a, b):
# implementation details..

def global_function(x):
# implementation

class Y:  # marks the start of another class
# ...

不过,有一种方法可以这样减少缩进(但它会用属于该类的函数污染全局命名空间):

def x_method(self, b):
#implementation

class X:
    x_method = x_method

正如@romankonova所暗示的,方法只是python中的值,您可以像修补任何其他值一样对它们进行修补:

def _some_method():
    pass

class Foo:
    some_method = _some_method

<强>但是,Python不是C++或Perl。你可能不想这么做!

你应该注意跟随PEP8 style guidelines。这几乎肯定会阻碍这种模式。如果将代码缩进4个空格会使行太长(PEP8说应该在79列处换行),那么您可能正在尝试做很多事情(在每行上,或者在该方法中)。您应该努力实现小的、可组合的函数,其中每一行都简洁明了。如果行必须溢出,可以在适当的地方使用行连续体。例如:

some_method(that, takes, a_long_list, of_parameters,
            that_overflows, onto_the, next_line)

除了风格之外,还有一些实际的理由不这么做。首先,如果您使用python的可选类型,我很肯定mypy不会理解some_methodFoo上的实例方法(您可能会在其他静态分析工具(如flake8)中看到类似的问题)。现在我并不是说你应该仅仅因为工具不理解它就避免某些东西。但是,我认为这段代码一开始会让我感到困惑,我怀疑其他人在看它的时候可能会被绊倒。你知道吗

编辑:我刚刚想到的另一点是:(同样按照Python != C++ or Perl的思路)Python作为一种语言,做出了有意义的空白导致更好的代码的设计决策。实际上,写得好的Python脚本读起来像英语,并且被组织成易于理解的段落式短语。如果您只是为了避免一级缩进而绕开它,那么对于大多数python程序员来说,您的代码将更难阅读。你知道吗

相关问题 更多 >