Как передать кортеж в функцию Python - PullRequest
1 голос
/ 05 февраля 2012

Я пытался передать кортеж функции, которую я создал ранее, однако я все еще не могу заставить ее работать. Моя цель состоит в том, чтобы передать кортеж со списком путей и файловых форм, который я хочу определить, и распечатать его.

Вот мой код

EXl = ('C:\\vd36e404.vdb','C:\\vd368c03.vdb')

def fileF(EXl):
    import os
    filesize = os.path.getsize(EXl)
    print (filesize);

fileF(EXl)

Это ошибки:

Traceback (most recent call last):
  File "C:\Documents and Settings\Administrator\workspace\test1py\testcallMyF.py", line 13, in <module>
    fileF(EXl)
  File "C:\Documents and Settings\Administrator\workspace\test1py\testcallMyF.py", line 9, in fileF
    filesize= os.path.getsize(EXl)
  File "C:\Python27\lib\genericpath.py", line 49, in getsize
    return os.stat(filename).st_size
TypeError: coercing to Unicode: need string or buffer, tuple found

Может ли кто-нибудь объяснить мне, почему? (Я использую Python 2.7.2)

Ответы [ 3 ]

4 голосов
/ 05 февраля 2012

Вы успешно передаете кортеж вашей собственной функции. Но os.path.getsize() не принимает кортежи, он принимает только отдельные строки.

Кроме того, этот вопрос немного сбивает с толку, потому что ваш пример не является кортежем путь + файл, который будет выглядеть примерно так: ('C:\\', 'vd36e404.vdb').

Чтобы справиться с чем-то подобным, вы можете сделать это:

import os

def fileF(EXl):
    filesize= os.path.getsize(EXl[0] + EXl[1])
    print (filesize);

Если вы хотите напечатать значения для нескольких путей, сделайте, как говорит Bing Hsu , и используйте цикл for. Или используйте понимание списка:

def fileF(EXl):
    filesizes = [os.path.getsize(x) for x in EXl]
    print filesizes

Или, если вы хотите, скажем, вернуть другой кортеж:

def fileF(EXl):
    return tuple(os.path.getsize(x) for x in EXl)
3 голосов
/ 05 февраля 2012
import   os

for xxx in EXl:
    filesize= os.path.getsize(xxx)
    print (filesize);
2 голосов
/ 11 июня 2012

Более элегантный пример:

map(fileF, EX1)

Это вызовет fileF отдельно с каждым из элементов в EX1.И, конечно, это эквивалентно

for element in EX1:
    fileF(element)

Просто выглядит красивее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...