Итак, я недавно возился с чем-то похожим на это, и я придумал следующее решение, которое использует способ ввода ввода, который отклоняет нежелательный файл, прежде чем он будет проверен любым логическим способом.
read_single_keypress()
любезность https://stackoverflow.com/a/6599441/4532996
def read_single_keypress() -> str:
"""Waits for a single keypress on stdin.
-- from :: https://stackoverflow.com/a/6599441/4532996
"""
import termios, fcntl, sys, os
fd = sys.stdin.fileno()
# save old state
flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
attrs_save = termios.tcgetattr(fd)
# make raw - the way to do this comes from the termios(3) man page.
attrs = list(attrs_save) # copy the stored version to update
# iflag
attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
| termios.ISTRIP | termios.INLCR | termios. IGNCR
| termios.ICRNL | termios.IXON )
# oflag
attrs[1] &= ~termios.OPOST
# cflag
attrs[2] &= ~(termios.CSIZE | termios. PARENB)
attrs[2] |= termios.CS8
# lflag
attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
| termios.ISIG | termios.IEXTEN)
termios.tcsetattr(fd, termios.TCSANOW, attrs)
# turn off non-blocking
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
# read a single keystroke
try:
ret = sys.stdin.read(1) # returns a single character
except KeyboardInterrupt:
ret = 0
finally:
# restore old state
termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
return ret
def until_not_multi(chars) -> str:
"""read stdin until !(chars)"""
import sys
chars = list(chars)
y = ""
sys.stdout.flush()
while True:
i = read_single_keypress()
_ = sys.stdout.write(i)
sys.stdout.flush()
if i not in chars:
break
y += i
return y
def _can_you_vote() -> str:
"""a practical example:
test if a user can vote based purely on keypresses"""
print("can you vote? age : ", end="")
x = int("0" + until_not_multi("0123456789"))
if not x:
print("\nsorry, age can only consist of digits.")
return
print("your age is", x, "\nYou can vote!" if x >= 18 else "Sorry! you can't vote")
_can_you_vote()
Здесь вы можете найти полный модуль здесь .
Пример:
$ ./input_constrain.py
can you vote? age : a
sorry, age can only consist of digits.
$ ./input_constrain.py
can you vote? age : 23
your age is 23
You can vote!
$ _
Обратите внимание, что природа этой реализации заключается в том, что она закрывает stdin, как только считывается что-то, что не является цифрой. Я не попал в enter после a
, но мне нужно было после чисел.
Вы можете объединить это с функцией thismany()
в том же модуле, чтобы разрешить, скажем, три цифры.
@PropertySource
не поддерживает YAML (вероятно, это будет весной 4.1). Вы можете установить spring.config.location
или spring.config.name
в список, разделенный запятыми (например, как системное свойство или аргумент командной строки).
Лично мне нравится все мое ЯМЛ в одном и том же месте (структура действительно помогает разбить его визуально, и вы можете использовать документы внутри файла, чтобы разделить его больше). Это просто вкус, я думаю.
Вы можете использовать активную концепцию профиля в своем основном файле yaml. Например:
spring.profiles.active: test
, что означает, что у вас должен быть файл application-test.yml
в вашем каталоге ресурсов. Учтите, что активные профили переопределяют свойства с одинаковыми именами в вашем основном файле yaml.
Для получения дополнительной информации посетите: http://docs.spring.io/spring-boot/docs/current/ ссылка / HTML / загрузочная-функция-profiles.html
, если у меня много конфигураций и / или сред, обычно я делаю так:
$ cat src/main/resources/application.yml:
spring:
profiles:
include: >
profile1,
profile2,
...
profileN
$ ls -lah src/main/resources/config:
drwxr-xr-x 4 mak staff 136B Apr 16 23:58 .
drwxr-xr-x 6 mak staff 204B Apr 17 01:54 ..
-rw-r--r-- 1 mak staff 60B Apr 16 23:58 application-profile1.yml
-rw-r--r-- 1 mak staff 62B Apr 16 23:16 application-profile2.yml
...
-rw-r--r-- 1 mak staff 50B Apr 16 23:16 application-profileN.yml
@ActiveProfiles
и установите только переопределения в профиле, который вы используете для тестирования. Или используйте@IntegrationTest
. ИлиReflectionTestUtils
. – Dave Syer 12 December 2014 в 08:27