Подтвердить что ты не робот

Инициализировать строковую переменную в Python: "" или Нет?

Предположим, что у меня есть класс с атрибутом string. Должен ли я инициализировать этот атрибут значением "" или Нет? Это нормально?

def __init__(self, mystr="")
   self.mystr = mystr

или

def __init__(self, mystr=None)
   self.mystr = mystr

Изменить. Я думал, что если я использую " как начальное значение, я" объявляю" переменную string тип. И тогда я не смогу присвоить ему какой-либо другой тип. Я прав?

Изменить. Я думаю, здесь важно отметить, что мое предложение было НЕПРАВИЛЬНО. И нет никакой проблемы, чтобы назначить другой тип переменной. Мне понравился комментарий S.Lott: "Поскольку ничего в Python не объявлено, вы не думаете об этом правильно".

4b9b3361

Ответ 1

Если значение не имеет значения в вашей программе (например, необязательное значение), вы должны использовать None. Это его цель в любом случае.

Если значение должно быть предоставлено вызывающим абонентом __init__, я бы рекомендовал не инициализировать его.

Если значение "" имеет смысл в качестве значения по умолчанию, используйте его.

В Python тип выводится из использования. Следовательно, вы можете изменить тип, просто назначив значение другого типа.

>>> x = None
>>> print type(x)
<type 'NoneType'>
>>> x = "text"
>>> print type(x)
<type 'str'>
>>> x = 42
>>> print type(x)
<type 'int'>

Ответ 2

None используется для обозначения "не установлено", тогда как любое другое значение используется для указания значения по умолчанию.

Следовательно, если ваш класс справляется с пустыми строками и вам нравится это значение по умолчанию, используйте ". Если вашему классу необходимо проверить, была ли вообще установлена ​​переменная, используйте" Нет".

Обратите внимание, что не имеет значения, была ли ваша переменная исходной. Вы можете изменить его на любой другой тип/значение в любой другой момент.

Ответ 3

Другой способ инициализации пустой строки - использовать встроенную функцию str() без аргументов.

ул (объект = '')

Возвращает строку, содержащую красиво отображаемое представление объекта.

...

Если аргумент не задан, возвращает пустую строку, '..

В исходном примере это будет выглядеть так:

def __init__(self, mystr=str())
   self.mystr = mystr

Лично я считаю, что это лучше передает ваши намерения.

Обратите внимание, что str() сам устанавливает значение параметра по умолчанию ''.

Ответ 4

Это зависит. Если вы хотите различать без какого-либо параметра, переданного вообще, и пустую строку передали, вы можете использовать None.

Ответ 5

Возможно, все будет хорошо, но я не думаю, что есть определенный ответ.

  • Если вы хотите указать, что значение не было установлено, сравнение с None лучше, чем сравнение с "", так как "" может быть допустимым значением,
  • Если вам просто нужно значение по умолчанию, "", вероятно, лучше, потому что это фактически строка, и вы можете вызвать на нем строковые методы. Если вы пошли с None, это приведет к исключениям.
  • Если вы хотите указать будущим сопровождающим, что здесь требуется строка, "" может помочь с этим.

Полное примечание:

Если у вас есть цикл, скажите:

def myfunc (self, mystr = ""):
    for other in self.strs:
        mystr = self.otherfunc (mystr, other)

тогда потенциальный будущий оптимизатор знал бы, что str всегда является строкой. Если вы использовали None, это может быть не строка до первой итерации, которая потребует циклического разворота для получения тех же эффектов. Хотя это не гипотетично (в моем компиляторе PHP очень много), вы наверняка никогда не будете писать свой код, чтобы принять это во внимание. Я просто подумал, что это может быть интересно:)

Ответ 6

Любопытно, хотя None чаще встречается как соглашение - None указывает, что для необязательного параметра не было передано никакого значения.

Бывают случаи, когда "" является правильным значением по умолчанию для использования - по моему опыту, эти времена происходят реже.

Ответ 7

Так как оба None и "являются ложными, вы можете сделать оба. См. 6.1. Тестирование ценности правды.

Edit

Чтобы ответить на вопрос в вашем редактировании: Нет, вы можете назначить другой тип.

>>> a = ""
>>> type(a)
<type 'str'>
>>> a = 1
>>> type(a)
<type 'int'>

Ответ 8

Для списков или dicts ответ более ясен, согласно http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#default-parameter-values используйте None в качестве параметра по умолчанию.

Но также для строк, (пустой) строковый объект инстанцируется во время выполнения для параметр ключевого слова.

Самый чистый путь, вероятно:

def myfunc(self, my_string=None):
    self.my_string = my_string or "" # or a if-else-branch, ...

Ответ 9

В любом случае в питоне все в порядке. Я бы лично предпочел "". но опять же, в любом случае все в порядке

>>>x = None
>>>print(x)
None
>>>type(x)
<class 'NoneType'>
>>>x = "hello there"
>>>print(x)
hello there
>>>type(x)
<class 'str'>
>>> 
>>>x = ""
>>>print(x)

>>>type(x)
<class 'str'>
>>>x = "hello there"
>>>type(x)
<class 'str'>
>>>print(x)
hello there

Ответ 10

empty_string = ""

if not empty_string:

    print "Empty string is not set"

=> Пустая строка не установлена

if empty_string is not None:
    print "Empty string is not None"

=> Пустая строка не является None

Ответ 11

Философия Python должна быть читабельной.
Поэтому рекомендуется определять ваши атрибуты в __init__() даже если это необязательно.
В том же духе вы должны спросить себя, что понятнее для любого, кто читает ваш код. Фактически сам тип дает много информации о будущем использовании вашей переменной. Так:

kind = None

Синтаксически правильно, но читатель не знает много. Это строка, код как целое число, список и т.д.?

kind_str = None
kind = ""

Оба говорят немного больше, первый имеет тип в своем имени, а второй в своем объявлении. Я бы пошел на второй, аккуратнее.