Как отменить эффект обратной косой черты?

#python

#питон #python

Вопрос:

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

 def func(prefix):
    prefix = prefix or ""
    some_name = prefix   "-"   "bar"
    print(some_name)
  

Предположим, я вызываю эту функцию, func("foo") результат будет foo-bar но когда я вызываю func(None) , результат будет -bar , и я хотел бы что-то большее, чем просто bar .

Теперь, очевидно, я мог бы выполнить условия write if и решить эту проблему. Но есть ли питонический способ сделать это? Это больше похоже на перевернутую версию b .

Тогда я мог бы написать что-то вроде

 prefix = prefix or "some_char"
  

это сотворило бы волшебство.

Комментарии:

1. Чтобы обратная косая черта из "some_char" была распознана как обратная косая черта, вам нужно удвоить ее. Что-то вроде этого: "\some_char" .

2. @accdias: нет, они надеялись, что b символ обратного пробела можно каким-то образом использовать для удаления - из созданной строки, если prefix есть None .

3. @MartijnPieters, О! Теперь я вижу. Спасибо, что указали на это.

4. Я не понимаю причины отрицательных голосов. Да, в bar была опечатка. Спасибо, что указали на это @MartijnPieters

Ответ №1:

Используйте str.join() и отфильтровывайте пустые компоненты:

 def func(prefix):
    return '-'.join(filter(None, (prefix, 'bar')))
  

Это работает и для пустых строк:

 >>> def func(prefix):
...     return '-'.join(filter(None, (prefix, 'bar')))
...
>>> func(None)
'bar'
>>> func('foo')
'foo-bar'
>>> func('')
'bar'
  

Хорошей альтернативой является просто использование условного выражения:

 def func(prefix):
    return f"{prefix}-bar" if prefix else "bar"
  

Опять же, пустые строки обрабатываются так же, как None там, используйте if prefix is not None , если пустая строка должна привести к '-bar' .

Ответ №2:

Включите - в эффективный префикс, а не в операцию объединения.

 def foo(prefix=None):
    # prefix = prefix   "-" if prefix is not None else ""
    prefix  = "-" if prefix else ""
    return prefix   "bar"
  

Если вы по какой-либо причине хотите получить результат, подобный "-bar" в некоторых обстоятельствах, вы можете отличить отсутствие префикса от пустого префикса.

 def foo(prefix=None):
    prefix  = "-" if prefix is not None else ""
    return prefix   "bar"
  

В этом случае foo() будет выдавать "bar" , в то время как foo("") будет выдавать "-bar" .

Комментарии:

1. Это prefix = prefix "-" if prefix is not None else "" может быть более питоническим, если написано как prefix = "-" if prefix else ""

2. Да, так лучше.

3. Я собираюсь добавить немного более длинную версию, которая позволяет foo(None) создавать "-bar" в дополнение к foo() продактингу "bar" . (Не уверен, зачем кому-то это может понадобиться , но это вариант).

4. У меня сложилось впечатление, что op хочет что-то для манипулирования путем. Если это так, pathlib было бы лучшим вариантом.