Tengo algunas rutas como (simplificado): / rootFolder / subfolder_1 / subsubfolder_1 /

paths = {
    'rootFolder':'rootFolder/'
    'subFolder_1':paths[rootFolder]+'subFolder/'
    'subsubFolder_1:paths[subfolder]+'subsubFolder/'
}

Básicamente, quiero un diccionario estático de rutas, pero también quiero mantener las dependencias para poder hacer un solo cambio en el futuro. No estoy seguro de si eso es factible, y si, ¿cómo? ¿Tienes algunas ideas mejores que las mías? Gracias de antemano por la ayuda.

2
user2678074 28 jun. 2016 a las 15:21

3 respuestas

La mejor respuesta

Puede usar funciones como valores para las teclas. Como las funciones no se invocan antes de que se construya dict, no habrá NameError.

In [320]: paths = { 'root': lambda: '/', 'usr': lambda: os.path.join(paths['root'](), 'usr')}

In [321]: paths['root']()
Out[321]: '/'

In [322]: paths['usr']()
Out[322]: '/usr'

In [323]: paths['root'] = lambda: '//'

In [324]: paths['usr']()
Out[324]: '//usr'

Si no desea hacer paths['root'](), simplemente subclase dict.

from types import FunctionType
import os

class DynDict(dict):
    def __getitem__(self, key):
        val = dict.__getitem__(self, key)
        return val() if type(val) is FunctionType else val

paths = DynDict(root='/', tmp=lambda: os.path.join(paths['root'], 'tmp'))
print(paths['root'], paths['tmp'])
paths['root'] = '/var/'
print(paths['root'], paths['tmp'])

Salida;

/ /tmp
/var/ /var/tmp
2
Nizam Mohamed 4 jul. 2016 a las 11:01

Simplemente puede crear una función para devolver el diccionario que desee.

def path_dict(root):
    return {'rootFolder':root,
            'subFolder_1':root+'subFolder/'
            'subsubFolder_1:root+'subfolder/subsubFolder/'
           }

Entonces

>>> path_dict('rootFolder/')
{'subsubfolder_1': 'rootFolder/subfolder/subsubfolder/', 'rootFolder': 'rootFolder/', 'subfolder_1': 'rootFolder/subfolder/'}

Si desea utilizar claves en el diccionario para construir, puede hacerlo inicializando el diccionario en varios pasos.

paths = {'rootFolder':'rootFolder/'}
paths['subFolder_1'] = paths['rootFolder']+'subFolder/'

No es una instanciación de una línea del directorio, pero puede combinar las dos para tener una instanciación de una línea con menos reutilización de código.

def path_dict(root):
    paths = {'rootFolder':root}
    paths['subFolder_1'] = paths['rootFolder']+'subFolder/'
    paths['subsubFolder_1'] = paths['subFolder_1']+'subsubFolder/'

    return paths
0
arewm 28 jun. 2016 a las 12:52
paths = {
  'rootFolder'    :  "'rootFolder/'",
  'subFolder_1'   :  "eval(paths['rootFolder']) + 'subFolder/'",
  'subsubFolder_1':  "eval(paths['subFolder_1'])+ 'subsubFolder/'"
}

Acceso a través de:

eval(paths["subsubFolder_1"])
# 'rootFolder/subFolder/subsubFolder/'

Puede encapsular el uso de evaluación mediante una función getPath ("keyInDict") que hace que la parte amigable para el usuario acceda al dict

0
frank 28 jun. 2016 a las 17:20