imbuto
Profilo di
Nome | imbuto |
---|---|
Indirizzo email | n/a |
Messaggi | 2 |
-
- 2023-10-02 18:38:34
- Re: Lista variabili non dichiarate in script
- Forum >> Principianti
- Per la cronaca, alla fine ho risolto con una cosa del genere (non ricordo se questa è la versione definitiva):
import ast import builtins def find_undeclared_identifiers(script): undeclared_identifiers = [] # Parse the script into an abstract syntax tree (AST) try: tree = ast.parse(script) except SyntaxError as e: return [str(e)] # Define a set of built-in identifiers builtins_set = set(dir(builtins)) # Define a visitor class to traverse the AST and collect undeclared identifiers class UndeclaredIdentifierVisitor(ast.NodeVisitor): def __init__(self): self.declared_identifiers = set() self.used_identifiers = set() def visit_Name(self, node): if isinstance(node.ctx, ast.Load): if node.id not in self.declared_identifiers and node.id not in builtins_set: self.used_identifiers.add(node.id) self.generic_visit(node) def visit_FunctionDef(self, node): self.declared_identifiers.add(node.name) self.generic_visit(node) def visit_ClassDef(self, node): self.declared_identifiers.add(node.name) self.generic_visit(node) def visit_Assign(self, node): for target in node.targets: if isinstance(target, ast.Name): self.declared_identifiers.add(target.id) self.generic_visit(node) visitor = UndeclaredIdentifierVisitor() visitor.visit(tree) # Filter out declared identifiers from used identifiers to find undeclared ones undeclared_identifiers = list(visitor.used_identifiers - visitor.declared_identifiers) return undeclared_identifiers
-
- 2023-09-28 10:09:14
- Lista variabili non dichiarate in script
- Forum >> Principianti
- Buongiorno!
Sto cercando una sorta di workaround per estrarre delle informazioni da alcuni script che verranno eseguiti da un tool a runtime nel main namespace (usando exec o qualcosa di equivalente).
Un Syntax check sullo script singolo presenta degli errori dovuti a variabili non dichiarate, che peró a runtime dovrebbero essere disponibili nel namespace (create dal tool), sul quale non ho controllo.
Esiste un modo (pensavo a moduli tipo inspect o ast) per estrarre una lista di oggetti utilizzati in uno script (variabili, classi, funzioni) ma non dichiarati o importati esplicitamente nello stesso che quindi per forza di cose devono "preesistenti" nel namespace (builtins o estensioni dell 'interprete) per rendere lo script eseguibile.
# spam.py foo = bar + 1
x = list_undeclared('spam.py') # >>> ['bar']
/OT Da storico utente di forumpython.it è stata una sorpresa vederlo offline, è questo ora l'unico forum rimasto? /OT