Что такое команда python для перечисления всех переменных, существующих в текущем worskpace, которые соответствуют определенному шаблону? Например, перечислите все существующие переменные/объекты в рабочей области, которые начинаются с "ABC",
Вы можете создать копию локальных varibals, вызвав copy
на locals()
(или globals()
альтернативы) для поиска по паре ключей значений имен переменных и значений, а затем делать то, что вы хотите, с результирующим словарем
import copy
ABCD = 'woof' # create the name and value of our var
local_dict = copy.copy(locals()) # create a shallow copy of all local variables, you don't want to iterate through a constantly changing dict
for name, value in d.items():
if name.startswith('ABC'):
print(name, value)
Вызов help(locals)
дает вам это как объяснение:
locals()
Return a dictionary containing the current scope local variables.
NOTE: Whether or not updates to this dictionary will affect name lookups in
the local scope and vice-versa is *implementation dependent* and not
covered by any backwards compatibility guarantees.
РЕДАКТИРОВАТЬ:
здесь короткое oneliner только для имени: [name for name in copy.copy(locals().keys()) if name.startswith('ABC')]
В R, ls(pattern=...)
выполняет две вещи:
так
alpha <- 1.
animal <- "dog"
tool <- "wrench"
ls(pattern="^a.*")
# "alpha" "animal"
myfunction <- function(){
value <- 1
ls(pattern="value")
}
myfunction()
# "value"
оба случая можно сделать в Python путем поиска через locals()
:
import re
alpha = 1.
animal = "dog"
tool = "wrench"
[x for x in locals() if re.match('^a.*', x)]
# ['alpha', 'animal']
def function():
value = 1
print([x for x in locals() if re.match('value', x)])
function()
# ['value']
ls(...)
К сожалению, вы не можете реализовать такую функцию, как ls()
в Python, которая ищет через locals()
поскольку, как только вы входите в эту функцию, текущая область данных теряется и вы получаете локальные переменные ls()
:
def ls(pattern='.*'):
return [x for x in locals() if re.match(pattern, x)]
def function():
value = 1
print(ls())
function()
# ['pattern'] <- This is actually in scope of 'ls()', not of 'function()'
ls()
# ['pattern'] <- This is actually in scope of 'ls()', not in global scope
для этого вам необходимо явно искать все переменные, которые являются локальными для родительского фрейма. Это можно сделать с помощью модуля inspect
:
import inspect
def ls(pattern='.*'):
return [x for x in inspect.currentframe().f_back.f_locals if re.match(pattern, x)]
def function():
value = 1
print(ls())
function()
# ['value'] <- This is in scope of 'function()'
ls()
# ['ls', 'function', ...] <- This is in global scope