Rivelare il modello del modulo per Python?

3

Javascript ha uno schema per la creazione di funzioni private chiamato Pattern rivelatore di JavaScript .

Nasconde le tue funzioni in una chiusura che restituisce un oggetto modificato per fornire l'accesso alle funzioni che vuoi rendere pubbliche.

Entrambe le lingue hanno la stessa mancanza di una parola chiave privata. Certo, puoi usare la principale convenzione di sottolineatura per segnalare il tuo desiderio di privacy, ma alcuni apparentemente vogliono far rispettare questo.

C'è qualche ragione tecnica per cui questo pattern non esiste in Python? Python non tace il linguaggio prototipato che javascript è ma è vicino. Ha anche delle chiusure quindi sono stato sorpreso di non aver trovato riferimenti a questo modello dalla comunità Python. C'è un nome diverso lì?

C'è una ragione tecnica che non può essere eseguita in Python o è semplicemente una differenza nella cultura della comunità?

    
posta candied_orange 12.08.2017 - 08:17
fonte

1 risposta

3

Python ha il supporto integrato per moduli e classi, quindi approcci come il modello di modulo rivelatore sono meno necessari. Ma dal momento che Python non supporta alcun incapsulamento se non per convenzione, l'imitazione di moduli in stile JS è a volte conveniente.

La difficoltà è che Python non ha funzioni anonime / lambda con corpi di istruzioni. Pertanto non è possibile scrivere un IIFE (espressione di funzione immediatamente invocata) come (function () { ... })() . Dobbiamo invece usare una funzione con nome.

def make_module():
  private_var = 42

  def private_function():
    pass

  class PrivateClass(object):
    pass

  class PublicClass(object):
    pass  # may use the private symbols

  return PublicClass

the_module = make_module()  # the_module is actually PublicClass

Possiamo usare un decoratore per invocare immediatamente una dichiarazione di funzione. Con il contenuto del modulo uguale, questo codice ha lo stesso effetto di cui sopra:

def module(make_module):
  return make_module()

@module
def the_module():
  ...  # as above

Le dichiarazioni di class di Python funzionano in modo molto simile a questo @module tranne per il fatto che invece di restituire alcuni simboli, tutto locals() del corpo della dichiarazione viene catturato e trasformato nei membri di una nuova classe. Potresti quindi forse usare anche l'hackery di metaclass per rimuovere alcune funzioni dalla definizione di una classe.

Uno svantaggio dei moduli basati sulla chiusura è che i simboli privati non hanno un nome globale completo: non è possibile indirizzarli dall'esterno. So che è l'intero punto di incapsulamento, ma questo significa anche che non puoi pickle di tali oggetti, il che potrebbe essere un problema per alcuni casi d'uso.

    
risposta data 12.08.2017 - 10:33
fonte

Leggi altre domande sui tag