Как изменить одно значение на другое в одном месте и использовать его в нескольких функциях? - PullRequest
0 голосов
/ 09 мая 2019

Я пишу тестирование автоматизации для API в BDD. Мне нужен переключатель между средами. Есть ли возможный способ изменить одно значение в одном месте, не добавляя это значение для каждой функции? Пример:

Я пытался сделать это, добавляя значение к каждой функции, но это делает весь проект очень сложным

headers = {
    'Content-Type': 'application/json',
    'country': 'fi'
}

что я должен переключать только значение страны в заголовках, например, с 'fi' на 'es' и тогда все функции должны переключиться в окружающую среду, например,

def sending_post_request(endpoint, user):
    url = fi_api_endpoints.api_endpoints_list.get(endpoint)
    personalId = {'personalId': user}
    json_post = requests.post(url,
                            headers=headers,
                            data=json.dumps(personalId)
                                )
    endpoint_message = json_post.text
    server_status = json_post.status_code

def phone_number(phone_number_status):
    if phone_number_status == 'wrong':
        cursor = functions_concerning_SQL_conection.choosen_db('fi_sql_identity')
        cursor.execute("SELECT TOP 1 PersonalId from Registrations where PhoneNumber is NULL")
        result = cursor.fetchone()
        user_with_no_phone_number = result[0]
        return user_with_no_phone_number
    else:
        cursor = functions_concerning_SQL_conection.choosen_db('fi_sql_identity')
        cursor.execute("SELECT TOP 1 PersonalId from Registrations where PhoneNumber is not NULL")
        result = cursor.fetchone()
        user_with_phone_number = result[0]
        return user_with_phone_number

и когда я изменю с 'fi' на 'es' в заголовках, я хочу:

fi_sql_identity change to es_sql_identity
url = fi_api_endpoints.api_endpoints_list.get(endpoint) change to 
url = es_api_endpoints.api_endpoints_list.get(endpoint)

спасибо и помогите пожалуйста

1 Ответ

1 голос
/ 09 мая 2019

Что касается вашего первоначального вопроса, решение для этого случая: замыкание :

def f(x):
    def long_calculation(y):
        return x * y
    return long_calculation

# create different functions without dispatching multiple times
g = f(val_1)
h = f(val_2)

g(val_3)
h(val_3)

Ну, проблема в том, почему вы hardcode все?С обновлением вы можете упростить вашу функцию как:

def phone_number(phone_number_status, db_name='fi_sql_identity'):
    cursor = functions_concerning_SQL_conection.choosen_db(db_name)

    if phone_number_status == 'wrong':
        sql = "SELECT TOP 1 PersonalId from Registrations where PhoneNumber is NULL"
    else:
        sql = "SELECT TOP 1 PersonalId from Registrations where PhoneNumber is not NULL"

    cursor.execute(sql)
    result = cursor.fetchone()
    return result[0]

Также, пожалуйста, не пишите как:

# WRONG
fi_db_conn.send_data()

Но используйте параметр :

region = 'fi' # or "es"
db_conn = initialize_conn(region)
db_conn.send_data()

И используйте файл конфигурации для хранения ваших конечных точек относительно вашего региона, например, рассмотрите YAML :

# config.yml
es:
  db_name: es_sql_identity
fi:
  db_name: fi_sql_identity

Затем используйте их в Python:

import yaml

with open('config.yml') as f:
    config = yaml.safe_load(f)

region = 'fi'
db_name = config[region]['db_name'] # "fi_sql_identity"

# status = ...
result = phone_number(status, db_name)

См. Дополнительную полезную ссылку для использования YAML.

...