Domanda

Quello che faccio a passare come primo parametro "object" per la funzione setattr(object, name, value), alle variabili impostati sul modulo attuale?

Ad esempio:

setattr(object, "SOME_CONSTANT", 42);

dando lo stesso effetto:

SOME_CONSTANT = 42

all'interno del modulo contenente queste righe (con il object corretta).

Sono generare diversi valori a livello di modulo in modo dinamico, e come io non so definire __getattr__ a livello di modulo, questo è il mio fallback.

È stato utile?

Soluzione

import sys

thismodule = sys.modules[__name__]

setattr(thismodule, name, value)

o, senza l'utilizzo di setattr (che rompe la lettera della domanda, ma soddisfa gli stessi scopi pratici; -):

globals()[name] = value

Nota : in un contesto di modulo, quest'ultimo è equivalente a:

vars()[name] = value

che è un po 'più conciso, ma non funziona all'interno di una funzione (vars() dà le variabili del campo di applicazione è chiamato a: variabili del modulo quando chiamato nell'ambito globale, e quindi è ok per usarlo R / W , ma le variabili della funzione quando viene chiamato in una funzione, e quindi deve essere trattata come R / O -. la documentazione on-line Python possono essere un po 'di confusione su questo specifico distinzione)

Altri suggerimenti

Se è necessario impostare le variabili di modulo con ambito all'interno del modulo, cosa c'è di sbagliato con global?

# my_module.py

def define_module_scoped_variables():
    global a, b, c
    a, b, c = 'a', ['b'], 3

così:

>>> import my_module
>>> my_module.define_module_scoped_variables()
>>> a
NameError: name 'a' is not defined
>>> my_module.a
'a'
>>> my_module.b
['b']

In Python 3.7, si sarà in grado di utilizzare __getattr__ a livello di modulo ( relativa risposta ).

PEP 562 :

def __getattr__(name):
    if name == "SOME_CONSTANT":
        return 42
    raise AttributeError(f"module {__name__} has no attribute {name}")
  1. Non lo faresti. Fareste globals()["SOME_CONSTANT"] = 42
  2. Non lo faresti. Si potrebbe memorizzare dinamicamente generati da qualche contenuto diverso da un modulo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top