#python #conventions #pep8
#питон #условные обозначения #pep8
Вопрос:
Я пытаюсь написать CLI для генерации классов python. Часть этого требует проверки идентификаторов, предоставленных при вводе пользователем, а для python для этого требуется убедиться, что идентификаторы соответствуют рекомендациям / стандартам pep8 для идентификаторов — классы с заглавными буквами, поля с all_lowercase_with_underscores, пакеты и модули с so on so четвертый-
# it is easy to correct when there is a identifier
# with underscores or whitespace and correcting for a class
def package_correct_convention(item):
return item.strip().lower().replace(" ","").replace("_","")
Но когда между токенами нет пробелов или подчеркиваний, я не уверен, как правильно использовать первую букву каждого слова в идентификаторе с заглавной буквы. Можно ли реализовать что-то подобное без использования искусственного интеллекта или чего-то подобного:
скажем, например:
# providing "ClassA" returns "classa" because there is no delimiter between "class" and "a"
def class_correct_convention(item):
if item.count(" ") or item.count("_"):
# checking whether space or underscore was used as word delimiter.
if item.count(" ") > item.count("_"):
item = item.split(" ")
elif item.count(" ") < item.count("_"):
item = item.split("_")
item = list(map(lambda x: x.title(), item))
return ("".join(item)).replace("_", "").replace(" ","")
# if there is no white space, best we can do it capitalize first letter
return item[0].upper() item[1:]
Комментарии:
1. Предоставление
ClassA
фактической отдачиClassA
. Можете ли вы привести наглядный пример (или несколько примеров, проясняющих проблему) с ожидаемым результатом и тем, чем он отличается от фактического результата? Кроме того, очевидно, что должен быть какой -то отличительный знак, например, заглавная буква. В конце концов, действительно ли «classa» — это «ClassA» или автор имел в виду «ClassA» или «Classa» (на каком бы языке это ни означало что-то)?2. Вам в основном нужен токенизатор и словарь принятых слов. И ему нужно вернуться назад. И это всегда будет эвристическим, потому что существуют допустимые строки, которые обозначают более одного способа, например
hislap
, предполагается обозначить какhiSlap
илиhisLap
? Примечание: Python уже предоставляетstr.capitalize
str.title
методы and, которые выполняют за вас большую часть работы, поэтому вы можете захотеть изучить их.
Ответ №1:
Что ж, при подходе, основанном на ИИ, это будет сложно, не идеально, много работы. Если это того не стоит, возможно, есть более простой и, безусловно, сравнительно эффективный.
Я понимаю, что худший сценарий "todelineatewordsinastringlikethat"
.
Я бы рекомендовал вам загрузить текстовый файл для английского языка, по одному слову в строке, и продолжить таким образом:
import re
string = "todelineatewordsinastringlikethat"
#with open("mydic.dat", "r") as msg:
# lst = msg.read().splitlines()
lst = ['to','string','in'] #Let's say the dict contains 3 words
lst = sorted(lst, key=len, reverse = True)
replaced = []
for elem in lst:
if elem in string: #Very fast
replaced_str = " ".join(replaced) #Faster to check elem in a string than elem in a list
capitalized = elem[0].upper() elem[1:] #Prepare your capitalized word
if elem not in replaced_str: #Check if elem could be a substring of something you replaced already
string = re.sub(elem,capitalized,string)
elif elem in replaced_str: #If elem is a sub of something you replaced, you'll protect
protect_replaced = [item for item in replaced if elem in item] #Get the list of replaced items containing the substring elem
for protect in protect_replaced: #Uppercase the whole word to protect, as we do a case sensitive re.sub()
string = re.sub(protect,protect.upper(),string)
string = re.sub(elem,capitalized,string)
for protect in protect_replaced: #Deprotect by doing the reverse, full uppercase to capitalized
string = re.sub(protect.upper(),protect,string)
replaced.append(capitalized) #Append replaced element in the list
print (string)
Вывод:
TodelIneatewordsInaStringlikethat
#You see that String has been protected but not delIneate, cause it was not in our dict.
Это, конечно, не оптимально, но, безусловно, будет работать сопоставимо с ИИ для задачи, которая, безусловно, не будет представлена так, как она есть для ИИ в любом случае (подготовка к вводу очень важна в ИИ).
Обратите внимание, что важно выполнить обратную сортировку списка слов. Потому что вы хотите сначала обнаружить полные строковые слова, а не вложенные. Например, в beforehand
«ты хочешь полный, а не before
или and
» .