15 Stimmen

Wenn monkey Parcheando sowohl in Ruby als auch in Python erlaubt ist, warum ist es in Ruby umstrittener?

In vielen Diskussionen, die ich über Ruby gehört habe, in denen Leute ihre Vorbehalte gegenüber der Sprache zum Ausdruck gebracht haben, wurde das Problem des Affen Parcheando als eine der Hauptsorgen genannt.

Ich höre jedoch selten die gleichen Argumente im Zusammenhang mit Python, obwohl es auch in der Sprache Python erlaubt ist.

Warum diese Unterscheidung?

Enthält Python verschiedene Arten von Sicherheitsvorkehrungen, um die Risiken dieser Funktion zu minimieren?

21voto

Mike Woodhouse Punkte 50241

Diese Technik wird in Python weniger praktiziert, was zum Teil daran liegt, dass die "Kernklassen" in Python (die in C implementierten) nicht wirklich veränderbar sind. In Ruby hingegen kann aufgrund der internen Implementierung (nicht besser, nur anders) so ziemlich alles dynamisch geändert werden.

Philosophisch gesehen ist es etwas, das in der Python-Gemeinschaft eher verpönt ist, in der Ruby-Welt deutlich weniger. Ich weiß nicht, warum Sie behaupten, dass es umstrittener ist (können Sie auf eine maßgebliche Referenz verweisen?) - meine Erfahrung ist, dass monkey-Parcheando eine akzeptierte Technik ist, wenn auch eine, bei der sich der Benutzer der möglichen Konsequenzen bewusst sein sollte.

16voto

Keith Gaughan Punkte 18701

Die Sprachen mögen es zulassen, aber keine der beiden Gemeinschaften duldet diese Praxis. Monkeypatching wird in keiner der beiden Sprachen geduldet, aber man hört häufiger davon in Ruby, weil die Form der offenen Klasse, die es verwendet, es sehr, sehr einfach macht, eine Klasse zu monkeypatchen und aus diesem Grund, in der Ruby-Gemeinschaft ist es akzeptabler, aber immer noch verpönt . Monkeypatching ist in Python einfach nicht so weit verbreitet oder so einfach, weshalb man in dieser Community nicht die gleichen Argumente dagegen hört. Python tut nichts, was Ruby nicht auch tut, um diese Praxis zu verhindern.

Der Grund, warum man in Ruby häufiger davon hört/liest, ist, dass dies in Ruby der Fall ist:

class MyClass
  def foo
    puts "foo"
  end
end

class MyClass
  def bar
    puts "bar"
  end
end

erhalten Sie eine Klasse, die zwei Methoden enthält, foo y bar während dies in Python der Fall ist:

class MyClass:
    def foo(self):
        print "foo"

class MyClass:
    def bar(self):
        print "bar"

hinterlässt eine Klasse, die nur die Methode bar da die Neudefinition einer Klasse die vorherige Definition vollständig aufhebt. Um monkeypatch in Python zu verwenden, müssen Sie dies tatsächlich schreiben:

class MyClass:
    def foo(self):
        print "foo"

def bar(self):
    print "bar"
MyClass.bar = bar

die schwieriger ist als die Ruby-Version. Das allein macht Ruby-Code viel einfacher zu monkeypatchen als Python-Code.

16voto

Matthew Schinckel Punkte 33617

Als Python-Programmierer, der Ruby ausprobiert hat (und es mag), denke ich, dass es eine gewisse ironische Parallele zu der Zeit gibt, als Python begann, populär zu werden.

C- und Java-Programmierer "bashten" Python mit der Begründung, dass es keine echte Sprache sei und dass die dynamische Natur seiner Typen gefährlich sei und es den Leuten erlaube, "schlechten" Code zu erstellen. Als Python immer beliebter wurde und die Vorteile der schnellen Entwicklungszeit offensichtlich wurden, ganz zu schweigen von der weniger ausführlichen Syntax:

// Java
Person p = new Person();

# Python
p = Person()

wurden in späteren Versionen von Java einige dynamischere Funktionen eingeführt. Autoboxing und -unboxing machen den Umgang mit Primitiven weniger mühsam, und Generics erlauben es uns, einmal zu kodieren und es auf viele Typen anzuwenden.

Mit einiger Belustigung habe ich gesehen, dass eine der wichtigsten flexiblen Funktionen von Ruby - Monkey Parcheando - von den Python-Anhängern als gefährlich angepriesen wird. Nachdem ich in diesem Jahr damit begonnen habe, Studenten in Ruby zu unterrichten, denke ich, dass die Möglichkeit, die Implementierung einer bestehenden Klasse, selbst einer, die Teil des Systems ist, zu "reparieren", sehr mächtig ist.

Natürlich kann man auch mal Mist bauen, und das Programm kann abstürzen. Ich kann auch in C ziemlich leicht einen Segfault verursachen. Und Java-Anwendungen können den Flammentod sterben.

Die Wahrheit ist, ich sehe Monkey Parcheando als den nächsten Schritt in der dynamischen und Meta-Programmierung. Komisch, denn das gibt es schon seit Smalltalk.

13voto

S.Lott Punkte 371691

"Enthält Python verschiedene Arten von Sicherheitsvorkehrungen, um die Risiken dieser Funktion zu minimieren?"

Ja. Die Gemeinschaft weigert sich, dies zu tun. Der Schutz ist rein sozial.

3voto

vartec Punkte 124396

In Python ist es etwas schwieriger, Grundtypen zu ändern.

Stellen Sie sich zum Beispiel vor, dass Sie Integer umdefinieren.

Rubin:

class Fixnum 
   def *(n)
      5 
   end 
end

2*2 ergibt nun 5.

Python:

>>> class int(int):
    def __mul__(self, x):
        return 5

>>> 2*2
4
>>> int(2)*int(2)
5

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X