#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
было бы лучшим вариантом.