Есть список, словарь и набор понятий, но нет кортежей (хотя изучите «генераторные выражения»).
Они обращаются к проблеме, когда традиционные циклы в Python являются операторами (не возвращаются ничего), а не выражения, которые возвращают значение.
Они не являются решением каждой проблемы и могут быть переписаны как традиционные циклы. Они становятся неудобными, когда состояние должно поддерживаться и amp; обновлено между итерациями.
Они обычно состоят из:
[<output expr> <loop expr <input expr>> <optional predicate expr>]
, но могут быть перекручены множеством интересных и причудливых способов.
Они могут быть аналогичны традиционные map()
и filter()
операции, которые все еще существуют в Python и продолжают использоваться.
Когда все сделано хорошо, они имеют высокий коэффициент удовлетворения.
System.console () вернет консоль, к которой подключено ваше приложение, если оно подключено, в противном случае оно возвращает null
. (Обратите внимание, что он доступен только от JDK 6.)
System.console (), как уже упоминалось @Bombe, работает для простых случаев проверки связи с консолью. Однако проблема с System.console () заключается в том, что он не позволяет вам определить, является ли это STDIN или STDOUT (или и то и другое, либо подключено к консоли).
Разница между Java System.console () и C isatty () могут быть проиллюстрированы в следующем случае-пробоем (где мы передаем данные в / из гипотетического Foo.class):
1) STDIN и STDOUT являются tty
%> java Foo
System.console() => <Console instance>
isatty(STDIN_FILENO) => 1
isatty(STDOUT_FILENO) => 1
2) STDOUT is tty
%> echo foo | java Foo
System.console() => null
isatty(STDIN_FILENO) => 0
isatty(STDOUT_FILENO) => 1
3) STDIN - tty
%> java Foo | cat
System.console() => null
isatty(STDIN_FILENO) => 1
isatty(STDOUT_FILENO) => 0
4) Ни STDIN, ни STDOUT не являются tty
%> echo foo | java Foo | cat
System.console() => null
isatty(STDIN_FILENO) => 0
isatty(STDOUT_FILENO) => 0
Я не могу сказать вам, почему Java не поддерживает лучшую проверку tty. Интересно, не поддерживают ли некоторые из целевых ОС Java.
Технически является возможным сделать это в Java (как указывал stephen-c @) с некоторым довольно простым JNI , но это сделает ваше приложение зависимым от C-кода, который не может быть переносимым в другие системы. Я могу понять, что некоторые люди, возможно, не захотят туда идти.
Быстрый пример того, как будет выглядеть JNI (закрашивание большого количества деталей):
Java: tty / TtyUtils.java
public class TtyUtils {
static {
System.loadLibrary("ttyutils");
}
// FileDescriptor 0 for STDIN, 1 for STDOUT
public native static boolean isTty(int fileDescriptor);
}
C: ttyutils.c (предполагает сопоставление ttyutils.h ), скомпилированный в libttyutils.so
#include <jni.h>
#include <unistd.h>
JNIEXPORT jboolean JNICALL Java_tty_TtyUtils_isTty
(JNIEnv *env, jclass cls, jint fileDescriptor) {
return isatty(fileDescriptor)? JNI_TRUE: JNI_FALSE;
}
Если у вас есть возможность использовать другой язык, большинство других языков, я могу думать о поддержке tty-checking , Но, поскольку вы задали этот вопрос, вы, наверное, уже это знаете. Первыми, которые приходят мне в голову (кроме C / C ++), являются Ruby , Python , Golang и Perl .
Console
, чтобы решить, будет ли он существовать или нет - оба stdin
и stdout
должны быть TTY, чтобы экземпляр Console
был доступен.
– dimo414
2 February 2016 в 07:23
Вы можете использовать библиотеку jnr-posix для вызова собственных методов posix из Java:
import jnr.posix.POSIX;
import jnr.posix.POSIXFactory;
import java.io.FileDescriptor;
POSIX posix = POSIXFactory.getPOSIX();
posix.isatty(FileDescriptor.out);
Короткий ответ заключается в том, что в стандартной Java нет прямого эквивалента 'isatty'. Там был RFE для чего-то подобного в базе данных Java Bug с 1997 года, но он имел только одно незначительное голосование.
Теоретически вы могли бы реализовать «isatty» используя магию JNI. Но это создает всевозможные потенциальные проблемы. Я даже не подумал бы о том, чтобы сделать это сам ...
1 - Голосование за ошибки Java, которые должны быть исправлены, исчезло примерно в то время, когда Oracle заняла Sun.
System.console()
будет null, если либоstdin
, либоstdout
перенаправлены, но он не говорит вам, какой из них он имеет. Это актуально, потому что иногда вам нужно знать, какой поток (если есть) подключен к консоли. Например, еслиstdout
перенаправляется в файл журнала, вы можете удалить escape-коды ANSI , но это же неверно, еслиstdin
перенаправлено. – Gili 15 August 2016 в 01:05