Фортран 90 добрых параметров

Вы можете легко добавить дополнительные функции к Page, используя prototype. И получите конкретный элемент, используя page.elementHandle .

Единственная разница между page.evaluate и page.evaluateHandle заключается в том, что page.evaluateHandle возвращает объект на странице (JSHandle).

Создать функцию elementContains

Модуль Puppeteer экспортирует классы следующим образом. Вы можете расширить их функциональные возможности, как вы хотите.

// extract the Page class
const { Page } = require("puppeteer/lib/Page");

Обычно созданный вами page становится this внутри прототипа. page.evaluateHandle станет this.evaluateHandle.

/**
 * @name elementContains
 * @param {String} selector specific selector globally search and match
 * @param {String} text filter the elements with the specified text
 * @returns {Promise} elementHandle
 */
Page.prototype.elementContains = function elementContains(...args) {
  return this.evaluateHandle((selector, text) => {
    // get all selectors for this specific selector
    const elements = [...document.querySelectorAll(selector)];
    // find element by text
    const results = elements.filter(element => element.innerText.includes(text));
    // get the last element because that's how querySelectorAll serializes the result
    return results[results.length-1]; 
  }, ...args);
};

Создайте функцию .get

Теперь, когда мы получили наш отличный elementContains, пришло время получить функцию get.

/**
 * Replicate the .get function
 * gets an element from the executionContext
 * @param {String} selector
 * @returns {Promise} 
 */
const { JSHandle } = require("puppeteer/lib/JSHandle");
JSHandle.prototype.get = function get(selector) {
  // get the context and evaluate inside
  return this._context.evaluateHandle(
    (element, selector) => {
      return element.querySelector(selector);
    },
    // pass the JSHandle which is itself
    this,
    selector
  );
};

Веселитесь с новой функцией

(async () => {
  const browser = await puppeteer.launch({
    headless: false
  });

  const page = await browser.newPage();
  await page.setContent(html); // your specified html text

  // get the element
  const elem = await page.elementContains('div', 'title1')

  // use it like any other normal element, click it, eval it, remove it etc.
  const content = await elem.$eval('h1', e=>e.innerText);
  console.log(content) // prints "title1"

  // OR use the built in click function
  const btn = await page.$('a', elem); // <-- pass the handle here
  await btn.click();

  // OR use our .get function to get another element
  const targetBtn = await elem.get('a');
  targetBtn.click(); // click it
})();

Результат: enter image description here

36
задан nbro 6 September 2017 в 19:37
поделиться

2 ответа

Из Portland Group Reference параметр KIND «указывает точность для внутренних типов данных». Таким образом, в объявлении

real(kind=4) :: float32
real(kind=8) :: float64

переменная float64 объявлена ​​как 8-байтовое вещественное число (старый Fortran DOUBLE PRECISION ), а переменная float32 объявлена ​​как 4-байтовое вещественное число (старый Fortran REAL ).

Это хорошо, потому что позволяет вам фиксировать точность ваших переменных независимо от компилятора и компьютера, на котором вы работаете. Если вы выполняете вычисление, которое требует большей точности, чем традиционное вещественное число с одинарной точностью IEEE (что, если вы используете класс численного анализа, очень вероятно), но объявите свою переменную как real :: myVar , вы ' Будет хорошо, если компилятор настроен по умолчанию для всех вещественных значений на двойную точность, но изменит параметры компилятора или перенесет код на другой компьютер с разными размерами по умолчанию для вещественных и целочисленные переменные приведут к некоторым неприятным сюрпризам (например, ваш итеративный решатель матриц взорвется).

Fortran также включает некоторые функции, которые помогут выбрать параметр KIND в соответствии с вашим нужно - SELECTED_INT_KIND и SELECTED_REAL_KIND - но если вы только учитесь, я бы не стал беспокоиться об этом сейчас.

Поскольку вы упомянули, что изучаете Фортран как часть класса,

2
ответ дан 27 November 2019 в 05:53
поделиться

HTTPS - это HTTP (протокол передачи гипертекста) плюс SSL (уровень защищенных сокетов). Сертификат необходим для использования любого протокола, использующего SSL.

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

Сертификат SSL содержит открытый ключ и издателя сертификата. Клиенты могут не только использовать сертификат для связи с сервером, они могут проверить, был ли сертификат криптографически подписан официальным центром сертификации. Например, если ваш браузер доверяет центру сертификации VeriSign, а VeriSign подписывает мой сертификат SSL, с некоторыми очень опытными людьми.)

Итак, если вы не можете рассчитывать на конкретную ценность, дающую вам одинаковое представление данных на разных платформах, что вы будете делать? Для этого предназначены внутренние функции SELECTED_REAL_KIND и SELECTED_INT_KIND . По сути, вы сообщаете функции, какие числа вам нужно представлять, и она возвращает тот тип, который вам нужно использовать.

Я обычно использую эти типы, так как они обычно дают мне 4-байтовые и 8-байтовые действительные значения:

!--! specific precisions, usually same as real and double precision
integer, parameter :: r6 = selected_real_kind(6) 
integer, parameter :: r15 = selected_real_kind(15) 

Поэтому я мог бы впоследствии объявить переменную как:

real(kind=r15) :: xd

Обратите внимание, что это может вызвать проблемы, если вы используете смешанные языковые программы, и вам нужно абсолютно указать количество байтов, которые занимают переменные. Если вам нужно убедиться, существуют встроенные функции запросов, которые расскажут вам о каждом типе, из которого вы можете определить объем памяти, занимаемый переменной, ее точность, диапазон экспоненты и т. д. Или вы можете вернуться к нестандартному, но банальному стилю объявления real * 4 , real * 8 и т. Д.

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

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

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

53
ответ дан 27 November 2019 в 05:53
поделиться
Другие вопросы по тегам:

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