Python построение функции из элементов списка лучших практик - PullRequest
0 голосов
/ 25 февраля 2020

Мне нужно написать функцию, которая принимает строку и выполняет итерацию по ключу серии, парам значений и возвращает строку замены. То, как у меня сейчас это есть, жестко запрограммировано и написано в PySpark:

import pyspark.sql.function as f

def replace(s):
    s = f.regexp_replace(s, '.*one.*', '1')
    s = f.regexp_replace(s, '.*two.*', '2')
    s = f.regexp_replace(s, '.*three.*', '3')
    return s

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

import re

def replace(s):
    s = re.sub('.*one.*', '1', s)
    s = re.sub('.*two.*', '2', s)
    s = re.sub('.*three.*', '3', s)
    return s

Мне нужно переписать это так, чтобы этот процесс был построен из файла json или импортированного объекта python на местном уровне. Порядок этих замен имеет значение (если у меня есть строка «два один три», я хочу, чтобы она была заменена на «1». Я хотел бы услышать отзывы о том, является ли файл json или импорт лучшей практикой, но в этот момент я буду импортировать объект в файл с именем replacements.py.

replacements = [
    ['.*one.*', '1'],
    ['.*two.*', '2'],
    ['.*three.*', '3']
]

, а затем я смогу построить эту функцию таким образом, но меня беспокоит, что каждый раз, когда я запускаю его столбец PySpark, он будет ссылаться на каждый раз заменяющий объект.

from replacements import replacements
import pyspark.sql.functions as f

def replace(s):
    for pair in replacements:
        s = f.regexp_replace(s, pair[0], pair[1])
    return s

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

from replacements import replacements
import pyspark.sql.functions as f

def build_replace(ls):
    def replace(s):
        for pair in replacements:
            s = f.regexp_replace(s, pair[0], pair[1])
        return s
    return replace

replace = build_replace(replacements)

Теоретически (и в идеале) он будет считывать из «замен» только один раз при построении функции, и тогда эта функция будет по существу жестко закодирована, как и оригинал. Я хотел бы знать, получаю ли я желаемый «жестко закодированный» эффект и если между этими двумя способами есть разница в производительности, или если есть лучшее решение, о котором я не знаю.

Заранее спасибо! * 101 8 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...