2015-01-24 3 views
-1
def hello(input, *args): 
    s=input.replace('%0','{0}') 
    v=s.format(args) 
    return v 

assert "hello stack"==hello("hello %0","stack") 

Я получаю Assertion ERROR и вывод: «привет („стек“,)» вместо «привет» стек ..... ПОЧЕМУ ???Неоднозначность в операции форматирования в питона

+2

FWIW, я не могу воспроизвести это на Python 3.4 и на [Python 2.7] (http://ideone.com/kyaKGQ) – vaultah

+1

Не называйте свою переменную 'input', то есть имя функции Python – CoryKramer

+4

звездочку в 'def hello (input, * args)'? Это приведет к ошибке, которую вы опубликовали. – unutbu

ответ

1

В коде, который генерирует ошибку, вы следующие в качестве заголовка функции:

def hello(input, *args): 

Это превратит args в кортеж всех позиционных аргументов. Код, который вы вставили в вопросе не вызывает ошибку:

>>> def hello(input, args): 
... s = input.replace('%0', '{0}') 
... v = s.format(args) 
... return v 
... 
>>> hello('hello %0', 'stack') 
'hello stack' 
>>> def hello2(input, *args): 
...  s = input.replace('%0', '{0}') 
...  v = s.format(args) 
...  return v 
... 
>>> hello2('Hello %0', 'stack') 
"Hello ('stack',)" 

Чтобы заставить его работать, необходимо расширить кортеж: v = s.format(*args).

Я не уверен, какова фактическая цель этого кода, потому что он будет принимать только первый аргумент; независимо от того, сколько реальных аргументов вы послали к методу:

>>> def hello3(input, *args): 
...  s = input.replace('%0', '{0}') 
...  v = s.format(*args) 
...  return v 
... 
>>> hello3('hello %0', 'stack', 'world') 
'hello stack' 

Это происходит потому, что {0} связывается с первым аргументом .format().

+1

Может просто добавить это, чтобы исправить это: 'v = s.format (* args)' –

Смежные вопросы