RxAndroid
- еще одна лучшая альтернатива этой проблеме, и это избавляет нас от проблем создания потоков, а затем публикует результаты в потоке пользовательского интерфейса Android. Нам просто нужно указать потоки, по которым должны выполняться задачи, и все обрабатывается внутренне.
Observable<List<String>> musicShowsObservable = Observable.fromCallable(new Callable<List<String>>() {
@Override
public List<String> call() {
return mRestClient.getFavoriteMusicShows();
}
});
mMusicShowSubscription = musicShowsObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<String>>() {
@Override
public void onCompleted() { }
@Override
public void onError(Throwable e) { }
@Override
public void onNext(List<String> musicShows){
listMusicShows(musicShows);
}
});
(Schedulers.io())
RxAndroid будет запускать getFavoriteMusicShows()
в другом потоке. AndroidSchedulers.mainThread()
, мы хотим наблюдать это Observable в потоке UI, т. е. хотим, чтобы наш обратный вызов onNext()
вызывался в потоке пользовательского интерфейса Для динамического выполнения операторов используется инструкция exec
.
>>> exec('y=3')
>>> y
3
Использование Eval: eval(expression)
Аргумент expression
передается и оценивается как выражение Python
, например:
>>> s=3
>>> eval('s==3')
True
>>> eval('s + 1')
4
>>> eval('s')
3
>>> eval('str(s)+"test"')
'3test'
Вы можете это выражение.
eval('"x"+str(i)+"="+"123"')
eval()
допускает только выражения . Назначение - это не выражение, а заявление; вам нужно будет использовать exec
.
Даже тогда вы могли бы использовать словарь globals()
для добавления имен в глобальное пространство имен, и вам не нужно было бы использовать произвольное выполнение выражения.
Вы действительно не хотите этого делать, вам нужно сохранить данные из ваших имен переменных и вместо этого использовать список или словарь:
x = ['123'] * 10
предоставит вам список, который вы можете указать как x[0]
, x[1]
и т. д. без необходимости выполнять произвольные выражения.