Введите проверку аргументов Python [дубликат]

Обычный способ обойти эту проблему - создать собственный модуль поиска, то есть FindXXX.cmake (в вашем случае это FindLwIP.cmake), чтобы вы могли создать переменную LwIP_INCLUDE_DIRS внутри пакета.

set(LwIP_INCLUDE_DIRS
    ${CMAKE_CURRENT_LIST_DIR}/../LwIP/include
    ${CMAKE_CURRENT_LIST_DIR}/../LwIP
    ${CMAKE_CURRENT_LIST_DIR}/../LwIP/include/XXX)
.
.
(omitted..)
.
.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LwIP DEFAULT_MSG LwIP_INCLUDE_DIRS LwIP_SOURCES LwIP_HEADERS)

С помощью вышеуказанного модуля поиска ваше приложение может корректно включать пакет и использовать переменные, созданные с помощью модуля find.

find_package(LwIP REQUIRED)
.
.
(omitted...)
.
.
include_directories(LwIP_INCLUDE_DIRS)
add_executable(${PROJECT_NAME}.elf ${SOURCES})

Так как ваша работа связана с STM32 & amp; cmake, позвольте мне дать вам отличный справочник, который также станет хорошей отправной точкой для вашей работы.

https://github.com/ObKo/stm32-cmake.git

Надеюсь, это поможет.

39
задан blackbrandt 19 June 2019 в 19:46
поделиться

5 ответов

Использовать isinstance () . Пример:

if isinstance(n, unicode):
    # do this
elif isinstance(n, Node):
    # do that
...
111
ответ дан Johannes Weiss 27 November 2019 в 02:03
поделиться
>>> isinstance('a', str)
True
>>> isinstance(n, Node)
True
13
ответ дан SilentGhost 27 November 2019 в 02:03
поделиться

Нет, аргументы проверки типов в Python не нужны. Это никогда необходимо.

Если ваш код принимает адреса как необработанную строку или как объект Node , ваш дизайн нарушен.

Это происходит из-за того факта, что если вы еще не знаете тип объект в вашей собственной программе, то вы уже делаете что-то не так.

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

У вас есть следующие более разумные опции:

  1. Создать конструктор объекта Node , который принимает необработанные строки, или функцию который преобразует строки в объектах Node . Сделайте так, чтобы ваша функция принимала переданный аргумент является объектом Node . Таким образом, если вам нужно пройти Строка для функции, которую вы просто делаете:

     myfunction (Node (some_string))
    

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

  2. Сделайте две функции, одну, которая принимает объекты Node и одну, которая принимает rawstrings. Вы можете сделать один звонок другой внутри, в большинстве удобный способ ( myfunction_str может создать объект Node и вызвать myfunction_node или наоборот).

  3. Объекты Make Node имеют метод __ str __ и внутри вашей функции, вызовите str () для полученного аргумента. Таким образом, вы всегда получаете строку по принуждению.

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

8
ответ дан user513951 27 November 2019 в 02:03
поделиться

Вы также можете использовать try catch для проверки типа при необходимости:

def my_function(this_node):
    try:
        # call a method/attribute for the Node object
        if this_node.address:
             # more code here
             pass
    except AttributeError, e:
        # either this is not a Node or maybe it's a string, 
        # so behavior accordingly
        pass

Вы можете увидеть пример этого в Начиная Python во втором о генераторах (стр. 197 в моем издании), и я верю в Python Cookbook . Много раз перехватывать AttributeError или TypeError проще и, видимо, быстрее. Кроме того, это может работать лучше всего таким образом, потому что тогда вы не привязаны к конкретному дереву наследования (например, ваш объект может быть узлом или это может быть какой-то другой объект, который ведет себя так же, как Узел ).

6
ответ дан Rob 27 November 2019 в 02:03
поделиться

Звучит так, будто вы ищете «универсальную функцию», которая работает по-разному в зависимости от заданных аргументов. Это немного похоже на то, как вы получите другую функцию при вызове метода для другого объекта, но вместо того, чтобы просто использовать первый аргумент (объект / себя) для поиска функции, вместо которой вы используете все аргументы.

Turbogears использует что-то подобное для принятия решения о том, как преобразовать объекты в JSON - если я правильно помню.

Есть статья от IBM об использовании пакета диспетчера для такого рода вещей:

Из этого article:

import dispatch
@dispatch.generic()
def doIt(foo, other):
    "Base generic function of 'doIt()'"
@doIt.when("isinstance(foo,int) and isinstance(other,str)")
def doIt(foo, other):
    print "foo is an unrestricted int |", foo, other
@doIt.when("isinstance(foo,str) and isinstance(other,int)")
def doIt(foo, other):
    print "foo is str, other an int |", foo, other
@doIt.when("isinstance(foo,int) and 3<=foo<=17 and isinstance(other,str)")
def doIt(foo, other):
    print "foo is between 3 and 17 |", foo, other
@doIt.when("isinstance(foo,int) and 0<=foo<=1000 and isinstance(other,str)")
def doIt(foo, other):
    print "foo is between 0 and 1000 |", foo, other
6
ответ дан Stevoisiak supports Monica 27 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

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