Для сравнения объекта String используйте = вместо == (double equals). Двойное равенство будет сравнивать ссылки, а не их значения.
Обновите код сравнения, как показано ниже:
private void checkFriendRequestStatus(final ButtonStatus buttonsCallback, final String strSignedInUID, final String visitedUsername, final String strVisitedUID) {
final DatabaseReference checkFriendRequestsRef = database.getReference("friend_requests/test/" + strSignedInUID);
checkFriendRequestsRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// choice is 1 to show buttons, then select which buttons to show with second params
if (dataSnapshot.child("friends/" + visitedUsername).getValue(String.class).equals(strVisitedUID)) {
buttonsCallback.setButtonStatus(1, 1);
}
else if (dataSnapshot.child("sentFriendRequest/" + visitedUsername).getValue(String.class).equals(strVisitedUID)) {
buttonsCallback.setButtonStatus(1, 2);
}
else if (dataSnapshot.child("receivedFriendRequests/" + visitedUsername).getValue(String.class).equals(strVisitedUID)) {
buttonsCallback.setButtonStatus(1, 3);
}
else {
buttonsCallback.setButtonStatus(1, 4);;
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
Вы повреждаете определение генератора, который должен выдать исключение StopIteration, когда повторение завершено (который автоматически обрабатывается оператором возврата в функции генератора),
Так:
def iterate(i):
for value in i:
yield value
return
Лучше всего позволять коду вызова обработать случай пустого итератора:
count = 0
for value in iterate(range([])):
print value
count += 1
else:
if count == 0:
print "list was empty"
Мог бы быть более чистый способ сделать вышеупомянутое, но это должно хорошо работать и не попадает ни в одну общую 'обработку итератора как список' прерывания ниже.
Существует пара способов сделать это. Вы могли всегда использовать Iterator
непосредственно:
def iterate(i):
try:
i_iter = iter(i)
next = i_iter.next()
except StopIteration:
print 'i is empty'
return
while True:
yield next
next = i_iter.next()
Но если Вы знаете больше о том, что ожидать от аргумента i
, можно быть более краткими:
def iterate(i):
if i: # or if len(i) == 0
for next in i:
yield next
else:
print 'i is empty'
raise StopIteration()
Если невозможно использовать для... еще таким образом, что лучший подход к этому так, чтобы оператор печати был только выполнен, когда ни к чему не приводят?
Максимум я могу думать:
>>> empty = True
>>> for i in [1,2]:
... empty = False
... if empty:
... print 'empty'
...
>>>
>>>
>>> empty = True
>>> for i in []:
... empty = False
... if empty:
... print 'empty'
...
empty
>>>
Подводя итог некоторых более ранних ответов, это могло быть решено как это:
def iterate(i):
empty = True
for value in i:
yield value
empty = False
if empty:
print "empty"
таким образом, действительно не "еще" существует включенный пункт.
Что относительно простого, если еще?
def iterate(i):
if len(i) == 0: print 'i is empty'
else:
for value in i:
yield value
Как вы заметили, для...иначе
обнаруживает только перерыв
. Так что это применимо только когда вы ищете что-то и затем stop.
Это не применимо к вашей цели не потому что это генератор, а потому что вы хотите обработать все элементы, без остановки (потому что вы хотите получить их все, но дело не в этом).
Так генератор или нет, но вам действительно нужен булев, как в решении Бера.
.