2012-12-18 10 views
1

Essayer d'obtenir cette ligne de code pour travailler, je continue à courir sur les questions, peu importe comment je changer la mise en forme autour de:Obtenir os.path.join pour travailler avec le générateur?

if not os.path.exists(os.path.join(IncludeSettings.FILE_URL, [str(x) for x in [year, month, day]])): 

(année, mois, jour) peut être soit ints ou des chaînes.

Traceback:

Traceback (most recent call last): 
    File "/home/tinyup/dev/lib/python2.7/site-packages/pyramid_debugtoolbar-1.0.3-py2.7.egg/pyramid_debugtoolbar/toolbar.py", line 117, in toolbar_tween 
    response = _handler(request) 
    File "/home/tinyup/dev/lib/python2.7/site-packages/pyramid_debugtoolbar-1.0.3-py2.7.egg/pyramid_debugtoolbar/panels/performance.py", line 55, in resource_timer_handler 
    result = handler(request) 
    File "/home/tinyup/dev/lib/python2.7/site-packages/pyramid-1.4a3-py2.7.egg/pyramid/tweens.py", line 20, in excview_tween 
    response = handler(request) 
    File "/home/tinyup/dev/lib/python2.7/site-packages/pyramid-1.4a3-py2.7.egg/pyramid/router.py", line 161, in handle_request 
    response = view_callable(context, request) 
    File "/home/tinyup/dev/lib/python2.7/site-packages/pyramid-1.4a3-py2.7.egg/pyramid/config/views.py", line 342, in rendered_view 
    result = view(context, request) 
    File "/home/tinyup/dev/lib/python2.7/site-packages/pyramid-1.4a3-py2.7.egg/pyramid/config/views.py", line 456, in _class_requestonly_view 
    response = getattr(inst, attr)() 
    File "/home/tinyup/dev/tinyuploads/tinyuploads/views/share.py", line 56, in view_process 
    return self.handle_file_upload(self.request.params['file'], shareID) 
    File "/home/tinyup/dev/tinyuploads/tinyuploads/views/share.py", line 101, in handle_file_upload 
    self.save(file, newFileName, isImage, uploadTime) 
    File "/home/tinyup/dev/tinyuploads/tinyuploads/views/share.py", line 166, in save 
    if not os.path.exists(os.path.join(IncludeSettings.FILE_URL, [str(x) for x in [year, month, day]])): 
    File "/home/tinyup/dev/lib/python2.7/posixpath.py", line 66, in join 
    if b.startswith('/'): 
AttributeError: 'list' object has no attribute 'startswith' 

Répondre

4

Il vous manque le « * » ici:

>>> os.path.join('foo', *['a','b']) 
'foo/a/b' 

Vous devez utiliser l'opérateur étoiles ici afin de passer les éléments de la liste sous forme de liste variable d'arguments décompressé à la méthode.

+0

Pouvez-vous préciser ce que le diable le * fait? – MasterGberry

+1

@MasterGberry voir [décompresser les listes d'arguments] (http://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists) dans la documentation Python. –

0

add * avant [str(x) for x in [year, month, day]]

*[str(x) for x in [year, month, day]]

0
if not os.path.exists(os.path.join(IncludeSettings.FILE_URL, str(year), str(month), str(day))): 

pour une meilleure lisibilité:

fname = os.path.join(IncludeSettings.FILE_URL, str(year), str(month), str(day)) 
if not os.path.exists(fname): 
1

@ user1833746 avait la première réponse, donc si vous acceptez toutes ces choses, accepter qu'un :)

En plus du déballage, Si vous n'allez pas utiliser la liste qui en résulte, vous pouvez changer le [ en ( pour en faire un vrai générateur (par opposition à la création d'une liste puis à l'itération). L'opérateur * "décompresse", ce qui signifie que les composants individuels de l'élément seront transmis à la fonction. Comme vous pouvez le voir dans le code ci-dessous, os.path.join accepte deux arguments: a (le nom du chemin d'accès) et *p (un nombre arbitraire de composants de chemin). Comme vous pouvez le voir, vous pouvez fournir n'importe quel nombre d'arguments de nom de chemin supplémentaires avec cette syntaxe (c'est-à-dire qu'il n'y a pas de variables fixes path_component1, path_component2). Dans votre cas, une fois que vous obtenez votre générateur de valeurs, vous « déballez » les en valeurs individuelles (pas un seul objet list ou generator), qui fonctionnent os.path.join poignées alors:

In [1]: import os 

In [2]: os.path.join('/home/myname', *(str(x) for x in ('one', 'two', 'three'))) 
Out[2]: '/home/myname/one/two/three' 

In [3]: os.path.join?? 
Type:   function 
Base Class:  <type 'function'> 
String Form: <function join at 0x7f4944c31a28> 
Namespace:  Interactive 
File:   /usr/lib/python2.6/posixpath.py 
Definition:  os.path.join(a, *p) 
Source: 
def join(a, *p): 
    """Join two or more pathname components, inserting '/' as needed. 
    If any component is an absolute path, all previous path components 
    will be discarded.""" 
    path = a 
    for b in p: 
     if b.startswith('/'): 
      path = b 
     elif path == '' or path.endswith('/'): 
      path += b 
     else: 
      path += '/' + b 
    return path 
Questions connexes