Идиома Python для 'Попытки ни до какого исключения повышена'

Если это - 2D игра, QGraphicsScene QT очень прост в использовании.

7
задан hopla 22 October 2009 в 10:10
поделиться

2 ответа

Примерно:

attempts = [
    { 'database'='postgres', 'user'='pgsql', ...},
    { 'database'='postgres', 'user'='postgres', 'host'='localhost', 'password'=getpass()},
    ...
]
conn = None
for attempt in attempts:
    try:
        conn = psycopg2.connect(**attempt)
        break
    except psycopg2.OperationalError:
        pass
if conn is None:
    raise a ruckus
CURSOR = conn.cursor()

Теперь, если вы не хотите вызывать getpass () без необходимости, вы должны проверить , если ' пароль 'при попытке: попытка [' пароль '] = getpass () или около того.

Теперь об этом глобальном ....

class MyCursor:
    def __init__(self):
        self.CURSOR = None
    def __call__(self):
        if self.CURSOR is None:
            <insert logic here>
        return self.CURSOR

get_cursor = MyCursor()

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

Собираем все вместе:

class MyCursor:
    def __init__(self):
        self.CURSOR = None
    def __call__(self):
        if self.CURSOR is None:
            attempts = [
                {'database'='postgres', 'user'='postgres'},
                {'database'='postgres', 'user'='pgsql'},
                {'database'='postgres', 'user'='postgres', 'host'='localhost', 'password'=True},
                {'database'='postgres', 'user'='pgsql', 'host'='localhost', 'password'=True},
            ]
            conn = None
            for attempt in attempts:
                if 'password' in attempt:
                    attempt['password'] = getpass()
                try:
                    conn = psycopg2.connect(**attempt)
                    break # that didn't throw an exception, we're done
                except psycopg2.OperationalError:
                    pass
            if conn is None:
                raise a ruckus # nothin' worked
            self.CURSOR = conn.cursor()
        return self.CURSOR
get_cursor = MyCursor()

Примечание: полностью непроверено

14
ответ дан 6 December 2019 в 19:38
поделиться

Вы близко. Вероятно, лучше всего в этом случае вложить вторую и последующие попытки в блок except. Таким образом, критическая часть вашего кода будет выглядеть так:

if not CURSOR:
    # try to connect and get a cursor
    try:
        # first try the bog standard way: db postgres, user postgres and local socket
        conn = psycopg2.connect(database='postgres', user='postgres')
    except psycopg2.OperationalError:
        # maybe user pgsql?
        try:
            conn = psycopg2.connect(database='postgres', user='pgsql')
        except psycopg2.OperationalError:
            # maybe it was postgres, but on localhost? prolly need password then
            try:
                conn = psycopg2.connect(database='postgres', user='postgres', host='localhost', password=getpass())
            except psycopg2.OperationalError:
                # or maybe it was pgsql and on localhost
                conn = psycopg2.connect(database='postgres', user='pgsql', host='localhost', password=getpass())
-1
ответ дан 6 December 2019 в 19:38
поделиться
Другие вопросы по тегам:

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