1

このコード行を機能させようとすると、フォーマットをどのように変更しても問題が発生し続けます。

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

(年、月、日) は整数または文字列のいずれかです。

トレースバック:

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'
4

4 に答える 4

4

ここに「*」がありません:

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

リスト項目をアンパックされた可変引数リストとしてメソッドに渡すには、ここでスター演算子を使用する必要があります。

于 2012-12-18T06:01:10.147 に答える
1

@ user1833746 が最初に答えを持っていたので、これらのいずれかを受け入れる場合は、それを受け入れてください:)

解凍に加えて、結果のリストを使用しない場合は、 を変更し[(真のジェネレーターにすることができます (リストを作成してからそれを反復するのではなく)。演算子は「アンパック」します。*つまり、アイテムの個々のコンポーネントが関数に渡されます。以下のコードでわかるように、os.path.joinは「2 つの」引数を受け入れます: a(パス名) と*p(任意の数のパス コンポーネント)。ご覧のとおり、この構文では追加のパス名引数をいくつでも指定できます (つまり、固定path_component1の ,path_component2変数はありません)。あなたの場合、値のジェネレーターを取得したら、それらを個々の値 (単一listまたはgeneratorオブジェクトではなく) に「アンパック」します。os.path.join関数は次に処理します。

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
于 2012-12-18T06:23:55.863 に答える
0

* を前に追加[str(x) for x in [year, month, day]]

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

于 2012-12-18T06:01:32.450 に答える
0
if not os.path.exists(os.path.join(IncludeSettings.FILE_URL, str(year), str(month), str(day))):

読みやすさのために:

fname = os.path.join(IncludeSettings.FILE_URL, str(year), str(month), str(day))
if not os.path.exists(fname):
于 2012-12-18T06:04:04.020 に答える