hasattr () по сравнению с попыткой - кроме блока для контакта с несуществующими атрибутами

В случае, когда вам явно необходимо прочитать значение, записанное 32-битной программой в 64-битной программе, можно жестко закодировать его. Просто потому, что другого выбора действительно нет.

Конечно, я бы абстрагировал его от вспомогательной функции. Например

public RegistryKey GetSoftwareRoot() {
  var path = 8 == IntPtr.Size 
    ? @"Software\Wow6432Node"
    : @"Software";
  return Registry.CurrentUser.OpenSubKey(path);
}
80
задан Imran 24 May 2009 в 05:11
поделиться

8 ответов

hasattr внутренне и быстро выполняет ту же задачу, что и блок try / except : it '

79
ответ дан 24 November 2019 в 09:47
поделиться

Первое.

Чем короче, тем лучше. Исключения должны быть исключительными.

0
ответ дан 24 November 2019 в 09:47
поделиться

Я бы предложил вариант 2. Вариант 1 имеет состояние гонки, если какой-то другой поток добавляет или удаляет атрибут.

Также у python есть идиома , которая EAFP («проще просить прощения, чем разрешения») лучше, чем LBYL («посмотри, прежде чем прыгнуть»).

3
ответ дан 24 November 2019 в 09:47
поделиться

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

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

Тем не менее, как сказал Ракс. Ольгуд указывает, что общение с другими людьми является одним из важных атрибутов кода, и то, что вы хотите сказать, сказав «это исключительная ситуация», а не «это то, что я ожидаю, должно произойти», может быть более важным.

может быть важнее, чем «это то, чего я ожидаю».

может быть важнее, чем «это то, чего я ожидаю».

2
ответ дан 24 November 2019 в 09:47
поделиться

I would say it depends on whether your function may accept objects without the attribute by design, e.g. if you have two callers to the function, one providing an object with the attribute and the other providing an object without it.

If the only case where you'll get an object without the attribute is due to some error, I would recommend using the exceptions mechanism even though it may be slower, because I believe it is a cleaner design.

Bottom line: I think it's a design and readability issue rather than an efficiency issue.

13
ответ дан 24 November 2019 в 09:47
поделиться

Any benches that illustrate difference in performance?

timeit it's your friend

$ python -mtimeit -s 'class C(object): a = 4
c = C()' 'hasattr(c, "nonexistent")'
1000000 loops, best of 3: 1.87 usec per loop
$ python -mtimeit -s 'class C(object): a = 4
c = C()' 'hasattr(c, "a")'
1000000 loops, best of 3: 0.446 usec per loop
$ python -mtimeit -s 'class C(object): a = 4
c = C()' 'try:
 c.a
except:
 pass'
1000000 loops, best of 3: 0.247 usec per loop
$ python -mtimeit -s 'class C(object): a = 4
c = C()' 'try:
 c.nonexistent
except:
 pass'
100000 loops, best of 3: 3.13 usec per loop
$

       |positive|negative
hasattr|  0.446 |  1.87 
try    |  0.247 |  3.13
84
ответ дан 24 November 2019 в 09:47
поделиться

Если вы тестируете только один атрибут Я бы сказал, используйте hasattr . Однако, если вы выполняете несколько обращений к атрибутам, которые могут существовать, а могут и не существовать, тогда использование блока try может сэкономить вам немного времени при вводе текста.

4
ответ дан 24 November 2019 в 09:47
поделиться

If not having the attribute is not an error condition, the exception handling variant has a problem: it would catch also AttributeErrors that might come internally when accessing obj.attribute (for instance because attribute is a property so that accessing it calls some code).

4
ответ дан 24 November 2019 в 09:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: